package eu.dnetlib.openaire.utils;

import eu.dnetlib.openaire.thrift.Author;
import eu.dnetlib.openaire.thrift.OpenAIREConnector;
import eu.dnetlib.openaire.thrift.Project;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.BasicConfigurator;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by antleb on 3/13/14.
 */
public class ClaimMigration {

    public static void main(String[] args) throws Exception {
        BasicConfigurator.configure();

        Class.forName("org.postgresql.Driver");
        foo("jdbc:postgresql://194.177.192.223:5432/dnet_openaire?user=dnet&password=dnetPwd");
    }

    public ClaimMigration() throws ClassNotFoundException {

    }

    private static void foo(String url) throws SQLException, IOException, TException {
        OpenAIREConnector.Client client = new ThriftClient().getConnector();
        Connection con = DriverManager.getConnection(url);
        PreparedStatement stmt = con.prepareStatement(readStatement());
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            String id = rs.getString("createdfrom");
            List<Author> authors = new ArrayList<Author>();
            List<Project> projects = new ArrayList<Project>();
            List<String> subjects = new ArrayList<String>();

            id = id.substring(id.indexOf(':') + 1);

            if (rs.getString("createdFrom").startsWith("driver")) {
                id = id.split("::")[1];
            }

            System.out.println("authors: " + rs.getArray("dc_creator"));

            for (String s:(String[]) rs.getArray("dc_creator").getArray()) {
                if (s != null)
                    authors.add(new Author(null, s.split("§§§")[1], null));
            }

            for (String s:(String[]) rs.getArray("oaf_projectid").getArray()) {
                projects.add(new Project(null, "corda_______::" + s));
            }

            for (String claimer:(String[]) rs.getArray("creators").getArray()) {
// String id, String source, String title, String description, String access_mode,
// String embargoEndDate, List<Author> authors, String url, String dcSource,
// String userName, String userEmail, List<String> projects, List<String> subjects,
// List<String> concepts, String publicationDate, String publisher, String language,
// String category, String doi

            client.insertAndClaimDocument(id,
                    (rs.getString("createdfrom").startsWith("doi")?"doi":"driver"),
                    rs.getString("dc_title"),
                    rs.getString("dc_description"),
                    rs.getString("oaf_accessmode"),
                    rs.getString("oaf_embargoenddate"),
                    authors,
                    ((String[])rs.getArray("dc_identifier").getArray())[0],
                    null,
                    null,
                    claimer,
                    projects,
                    subjects,
                    new ArrayList<String>(),
                    rs.getString("oaf_publicationdate"),
                    rs.getString("dc_publisher"),
                    rs.getString("dc_language"),
                    rs.getString("dr_CobjCategory"),
                    null);
            }

        }

        rs.close();
        stmt.close();
        con.close();

    }

    private static String readStatement() throws IOException {
        InputStream is = ClassLoader.getSystemResourceAsStream("eu/dnetlib/openaire/utils/claims.sql");
        StringWriter sw = new StringWriter();

        IOUtils.copy(is, sw);

        is.close();

        return sw.toString();
    }
}
