package eu.dnetlib.data.claims.handler;

import eu.dnetlib.data.claims.entity.Project;
import eu.dnetlib.data.claims.sql.SQLStoreException;
import eu.dnetlib.data.claims.sql.SqlDAO;
import eu.dnetlib.data.claims.utils.QueryGenerator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by konstantina on 10/4/2017.
 */
public class FetchProjectHandler {
    private Logger log = LogManager.getLogger(this.getClass());

    SqlDAO sqlDAO = null;
    QueryGenerator queryGenerator = null;

    public FetchProjectHandler(){

    }
/*
    public String fetchProjectIdByTokenAndEmail(String token, String email) throws Exception, SQLStoreException {
        String openaireId = null;
        ArrayList<Object> params = new ArrayList<>();
        String query = queryGenerator.generateSelectProjectIdByTokenAndEmailQuery(token, email, params);
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);

        if(rs.next()) {
            openaireId = rs.getString(1);
        }
        rs.close();
        return openaireId;
    }

    public String fetchProjectIdByToken(String token) throws Exception, SQLStoreException {
        String openaireId = null;
        ArrayList<Object> params = new ArrayList<>();
        String query = queryGenerator.generateSelectProjectIdByTokenQuery(token, params);
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);

        if(rs.next()) {
            openaireId = rs.getString(1);
        }
        rs.close();
        return openaireId;
    }
*/
    public Project fetchProjectById(String projectId) throws Exception, SQLStoreException {
        ArrayList<Object> params = new ArrayList<>();
        String query = queryGenerator.generateSelectProjectByIdQuery(projectId, params);
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);

        Project project = fetchProjectByResultSet(rs);
        if(project == null) {
            log.info("No project with id : "+ projectId+"\n");
        }

        return project;
    }

    public List<String> fetchContactEmailsByProjectId(String projectId) throws Exception, SQLStoreException {
        ArrayList<Object> params = new ArrayList<>();
        String query = queryGenerator.generateSelectContactEmailsByProjectIdQuery(projectId, params);
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);

        List<String> mails = null;

        while(rs.next()) {
            if(mails == null) {
                mails = new ArrayList<String>();
            }
            mails.add(rs.getString(1));
        }
        return mails;
    }

    public Map<String, String> fetchProjectIdsAndNamesByProjectManagerMail(String userMail) throws Exception, SQLStoreException {
        ArrayList<Object> params = new ArrayList<>();
        String query = queryGenerator.generateSelectProjectIdsAndNamesByProjectManagerMail(userMail, params);
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);

        Map<String, String> projectIdsAndNames = null;
        while(rs.next()) {
            if(projectIdsAndNames == null) {
                projectIdsAndNames = new HashMap<String, String>();
            }
            projectIdsAndNames.put(rs.getString(1), rs.getString(2));
        }
        return projectIdsAndNames;
    }

    public Project fetchProjectByResultSet(ResultSet rs) throws Exception {
        Project project = null;
        while(rs.next()) {
            project = new Project();
            project.setOpenaireId(rs.getString(1));
            project.setName(rs.getString(2));
            project.setAcronym(rs.getString(3));
            project.setFunderId(rs.getString(4));
            project.setFunderName(rs.getString(5));
            project.setFunderShortName(rs.getString(6));
            //project.setContactEmails((List<String>)rs.getArray(7));
        }
        return project;
    }

    public SqlDAO getSqlDAO() {
        return sqlDAO;
    }

    public void setSqlDAO(SqlDAO sqlDAO) {
        this.sqlDAO = sqlDAO;
    }

    public QueryGenerator getQueryGenerator() {
        return queryGenerator;
    }

    public void setQueryGenerator(QueryGenerator queryGenerator) {
        this.queryGenerator = queryGenerator;
    }
}
