package eu.dnetlib.data.claims.handler;

import eu.dnetlib.data.claims.entity.Result;
import eu.dnetlib.data.claims.sql.SQLStoreException;
import eu.dnetlib.data.claims.sql.SqlDAO;
import eu.dnetlib.data.claims.utils.ClaimUtils;
import eu.dnetlib.data.claims.utils.QueryGenerator;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Created by kiatrop on 5/2/2016.
 */
public class ResultHandler  {
    private Logger log = LogManager.getLogger(this.getClass());
    SqlDAO sqlDAO = null;
    QueryGenerator queryGenerator = null;
    String pathToSaveRecord = null;

/*    public String generateSaveQueryForResult(Result result){
        return queryGenerator.generateInsertResultQuery(result.getOpenaireId(),result.getResultType(),result.getTitle(),result.getCollectedFrom(),result.getExternalUrl(),result.getDOI(), result.getOrcidworkid(), result.getAccessRights(),result.getEmbargoEndDate(),result.getBestLicense(),result.getRecordPath(), result.getRecordFormat());
    }
    public void saveResult(Result result) throws Exception {
        sqlDAO.executePreparedQuery(generateSaveQueryForResult(result));
    }*/

    public String exportMetadataFileForResult(Result result)  {
        if(result.getOpenaireId()!=null && result.getMetadataRecord()!=null){
            String path=createExportPath(result.getResultType(),result.getCollectedFrom(),result.getOpenaireId());
            try {
                //TODO check what should be saved in the path field
                FileUtils.writeStringToFile(new File(this.pathToSaveRecord+path), result.getMetadataRecord());
                return path;
            } catch (IOException e) {
                log.error("Couldn't write record to file "+ path,e);

            }
        }

        return null;
    }
    private String createExportPath(String type, String collectedFrom, String openaireId){
        String datasource=ClaimUtils.OPENAIRE;
        if(collectedFrom.equals(ClaimUtils.COLLECTED_FROM_ORCID)){
            datasource=ClaimUtils.ORCID;
        }else if(collectedFrom.equals(ClaimUtils.COLLECTED_FROM_CROSSREF)){
            datasource=ClaimUtils.CROSSREF;
        }else if(collectedFrom.equals(ClaimUtils.COLLECTED_FROM_DATACITE)){
            datasource=ClaimUtils.DATACITE;
        }
        //TODO fix this openaireId.replace("/","*") ?? url encode
        //temporary solution for external results with doi which contain "/" (It creates folders in path)
        return type+"/"+datasource+"/"+openaireId.replace("/","*");

    }
    public void deleteRecordFile(String type, String id) throws SQLStoreException, SQLException {
            ResultSet rs = sqlDAO.executePreparedQuery(queryGenerator.generateCountClaimsForResultQuery(id));
            if(rs.next()){
                Integer count =  rs.getInt(1);
                log.debug("Count is:" + count );

                if(count != null && count ==1){
                    ResultSet rs1 = sqlDAO.executePreparedQuery(queryGenerator.generateSelectResultSource(id));
                    if(rs1.next()){
                        String source =  rs1.getString(1);

                        log.debug("source is:" + source );
                        String path=createExportPath(type, source, id);
                         File file = new File(this.pathToSaveRecord+path);
                        log.debug("path is:" + path );


                        if (file.delete()) {
                            log.info(file.getName() + " is deleted!");
                        } else {
                            log.warn("Delete operation is failed for file "+ this.pathToSaveRecord+path);
                        }
                    }else{
                        log.error("Couldn't get result source for result with id : "+ id );

                    }

                }else{
                    log.info("This metadata file cannot be removed (count="+count+") for result with id : "+ id );
                }
            }else{
                log.error("Couldn't fetch claims count for result with id : "+ id );
            }
    }

    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;
    }

    public String getPathToSaveRecord() {
        return pathToSaveRecord;
    }

    public void setPathToSaveRecord(String pathToSaveRecord) {
        this.pathToSaveRecord = pathToSaveRecord;
    }

}
