package eu.dnetlib.espas.jdbc.configuration;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@XmlRootElement(name = "configuration")
public class JdbcConfiguration {
    private static Logger logger = Logger.getLogger(JdbcConfiguration.class);

    static {
        logger.setLevel(Level.ALL);
    }

    private List<Query> queries = new ArrayList<Query>();
    private List<Database> databases = new ArrayList<Database>();

    @SuppressWarnings("UnusedDeclaration")
    @XmlElementWrapper(name = "queries")
    @XmlElement(name = "query")
    public List<Query> getQueries() {
        return queries;
    }

    @SuppressWarnings("UnusedDeclaration")
    @XmlElementWrapper(name = "databases")
    @XmlElement(name = "database")
    public List<Database> getDatabases() {
        return databases;
    }

    public Query getQuery(String resourceType, String queryType) {
        for (Query query : queries)
            if (query.getResourceType().equalsIgnoreCase(resourceType)
                    && query.getQueryType().equalsIgnoreCase(queryType))
                return query;

        return null;
    }

    public Database getDatabase(String name) {
        for (Database database : databases)
            if (database.getName().equalsIgnoreCase(name))
                return database;
        return null;
    }

    public static void main(String[] args) throws JAXBException, IOException {
        JdbcConfiguration configuration = new JdbcConfiguration();
        FileInputStream fileInputStream = null;
        JAXBContext ctx = JAXBContext.newInstance(JdbcConfiguration.class);
        Marshaller m = ctx.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

//The following lines create a configuration file and print the result

        configuration.queries.add(new Query());
        configuration.databases.add(new Database("individual", "mysql", "com.mysql.jdbc.Driver", "jdbc:mysql://194.177.192.229:3306/server_dias", "dnet", "dnetPwd"));
        configuration.queries.get(0).setResourceType("ACQUISITION");
        configuration.queries.get(0).setQueryType("ID");
        configuration.queries.get(0).setDatabase("individual");
        configuration.queries.get(0).getTemplates().add(new Template("Aquisition", "eu/dnetlib/espas/catalogueservice/jdbc/templates/AcquisitionXML.vm"));
        configuration.queries.get(0).getStatements().add(new Statement("individual", "select * from individual limit 1;", true));

        configuration.queries.get(0).getStatements().add(new Statement("instruments", "select * from instrument"));
        configuration.queries.get(0).getStatement("instruments").setKeys("id:1");

        configuration.queries.get(0).getInputParameters().add(new InputParameter("id", "id"));
        configuration.queries.get(0).getOutputParameters().add(new OutputParameter("identifier", -1, null, "class"));
        configuration.queries.get(0).getOutputParameter("identifier").getParameters().add(new OutputParameter("localId", "localId"));
        configuration.queries.get(0).getOutputParameter("identifier").getParameters().add(new OutputParameter("version", "version"));
        configuration.queries.get(0).getOutputParameter("identifier").getParameters().add(new OutputParameter("namespace", "namespace"));
        configuration.queries.get(0).getOutputParameter("identifier").getParameters().add(new OutputParameter("creationDate", "creationdate"));
        configuration.queries.get(0).getOutputParameter("identifier").getParameters().add(new OutputParameter("lastModificationDate", "lastmodificationdate"));

        configuration.queries.get(0).getOutputParameters().add(new OutputParameter("instruments", -1, "instruments", "list"));
        configuration.queries.get(0).getOutputParameter("instruments").getParameters().add(new OutputParameter("id", 1));

        Statement statement = configuration.queries.get(0).getStatement("instruments");

        String[] keys = statement.getKeys().split(",");
        for (String key : keys) {
            String keyValue = key.split(":")[0];
            int order =  Integer.parseInt(key.split(":")[1]);

            System.out.println("Key " + keyValue + ", order " + order);
        }

        m.marshal(configuration, System.out);

//The following lines are to create the schema (conf.xsd) of the configuration class
//
//        ctx.generateSchema(new SchemaOutputResolver() {
//            @Override
//            public Result createOutput(String namespaceURI,
//                                       String suggestedFileName) throws IOException {
//                File file = new File("conf.xsd");
//                StreamResult result = new StreamResult(file);
//                result.setSystemId(file.toURI().toURL().toString());
//                return result;
//            }
//        });
//
//        File file = new File("conf.xsd");
//        fileInputStream = new FileInputStream(file);
//
//        int content;
//        while ((content = fileInputStream.read()) != -1) {
//            System.out.print((char) content);
//        }
    }
}