package eu.dnetlib.data.claims.handler;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import sun.net.www.protocol.http.HttpURLConnection;

import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;


/**
 * Created by argirok on 26/4/2017.
 */
public class DirectIndexHandler {

    private String directClaimAPIUrl;
    private String newDirectClaimAPIUrl;
    private static final Logger logger = LogManager.getLogger(DirectIndexHandler.class);


    public boolean insertRecord(String record){

        return this.feedIndex(record);
    }
    public boolean updateRecord(String record){

        return this.feedIndex(record);
    }
    public boolean deleteRecord(String originalId, String collectedFromId){

        return this.removeObjectFromIndex(originalId,collectedFromId);
    }

    private boolean feedIndex(String record) {

        URL obj = null;
        try {
            obj = new URL(newDirectClaimAPIUrl != null ? newDirectClaimAPIUrl : (directClaimAPIUrl+"/feedObject"));
        } catch (MalformedURLException e) {
            logger.error("Malformed  direct Claim APIUrl" + directClaimAPIUrl,e);
            return false;

        }
        if(newDirectClaimAPIUrl != null ){
            HttpsURLConnection con = null;
            try {
                con = (HttpsURLConnection) obj.openConnection();


                //add request header
                con.setRequestMethod("POST");
                //con.setRequestProperty("User-Agent", USER_AGENT);
                con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
                con.setRequestProperty("Content-Type", "application/json");

                logger.info("Feeding index with " + record);
                String urlParameters = record;

                // Send post request
                con.setDoOutput(true);
                DataOutputStream wr = new DataOutputStream(con.getOutputStream());
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(wr, "UTF-8"));
                writer.write(urlParameters);
                writer.close();
                wr.close();

                int responseCode = con.getResponseCode();
                logger.info("\nSending 'POST' request to URL : " + directClaimAPIUrl);
                logger.info("Post parameters : " + urlParameters);
                logger.info("Response Code : " + responseCode);

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                if (responseCode != 200) {
                    logger.error("An error occured. Record isn't saved in the Index.\n" + response.toString());
                    return false;
                } else {
                    return true;
                }
            } catch (IOException e) {
                logger.error("An error occured while trying to feed object", e);

                return false;
            }
        }else {
            HttpURLConnection con = null;
            try {
                con = (HttpURLConnection) obj.openConnection();


                //add request header
                con.setRequestMethod("POST");
                //con.setRequestProperty("User-Agent", USER_AGENT);
                con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
                con.setRequestProperty("Content-Type", "application/json");

                logger.info("Feeding index with " + record);
                String urlParameters = record;

                // Send post request
                con.setDoOutput(true);
                DataOutputStream wr = new DataOutputStream(con.getOutputStream());
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(wr, "UTF-8"));
                writer.write(urlParameters);
                writer.close();
                wr.close();

                int responseCode = con.getResponseCode();
                logger.info("\nSending 'POST' request to URL : " + directClaimAPIUrl);
                logger.info("Post parameters : " + urlParameters);
                logger.info("Response Code : " + responseCode);

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                if (responseCode != 200) {
                    logger.error("An error occured. Record isn't saved in the Index.\n" + response.toString());
                    return false;
                } else {
                    return true;
                }
            } catch (IOException e) {
                logger.error("An error occured while trying to feed object", e);

                return false;
            }
        }
    }
    private boolean removeObjectFromIndex(String originalId, String collectedFromId){

        URL obj = null;
        String urlParameters = "?originalId="+originalId+"&collectedFromId="+collectedFromId;

        try {
            obj = new URL(directClaimAPIUrl+"/deleteObject"+urlParameters);
        } catch (MalformedURLException e) {
            logger.error("Malformed  direct Claim APIUrl" + directClaimAPIUrl,e);
            return false;

        }
        HttpURLConnection con = null;
        try {
            con = (HttpURLConnection) obj.openConnection();



            //add request header
            con.setRequestMethod("POST");
            //con.setRequestProperty("User-Agent", USER_AGENT);
            con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
            con.setRequestProperty("Content-Type", "application/json");


            // Send post request
            con.setDoOutput(true);
//            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
//            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(wr, "UTF-8"));
//            writer.write(urlParameters);
//            writer.close();
//            wr.close();

            int responseCode = con.getResponseCode();
            logger.info("\nSending 'POST' request to URL : " + directClaimAPIUrl+urlParameters);
            logger.info("Post parameters : " + urlParameters);
            logger.info("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            //print result
            logger.info(response.toString());
            if(response.toString().equals("true")){
                return true;
            }else{
                return false;
            }
        } catch (IOException e) {
            logger.error("An error occured while trying to delete object",e);

            return false;
        }
    }

    public String getDirectClaimAPIUrl() {
        return directClaimAPIUrl;
    }

    public void setDirectClaimAPIUrl(String directClaimAPIUrl) {
        this.directClaimAPIUrl = directClaimAPIUrl;
    }

    public String getNewDirectClaimAPIUrl() {
        return newDirectClaimAPIUrl;
    }

    public void setNewDirectClaimAPIUrl(String newDirectClaimAPIUrl) {
        this.newDirectClaimAPIUrl = newDirectClaimAPIUrl;
    }
}