package eu.dnetlib.data.claims.utils;

import com.google.gson.Gson;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

public class ManagerUtils {
    private static String registryAPIForManagerEmails;
    private String id;
    private String email;
    private String name;
    private String memberSince;

    private final static Logger log = LogManager.getLogger(ManagerUtils.class);

    public String getRegistryAPIForManagerEmails() { return registryAPIForManagerEmails; }
    public void setRegistryAPIForManagerEmails(String registryAPIForManagerEmails) { ManagerUtils.registryAPIForManagerEmails = registryAPIForManagerEmails; }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getMemberSince() {
        return memberSince;
    }

    public void setMemberSince(String memberSince) {
        this.memberSince = memberSince;
    }

    public  List<ManagerUtils> getManagersByEmail(String community) {
        String url = registryAPIForManagerEmails.replace("{community}", community);

        URL obj = null;
        String responseStr = null;
        log.debug("Registry url is " + url);

        try {
            obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
             log.debug("Get manager emails from registry response code is: " + con.getResponseCode());
            if (con.getResponseCode() != 200) {
                return null;
            }
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuffer response = new StringBuffer();
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine).append("\n");
            }
            in.close();
            responseStr = response.toString();
        } catch (Exception e) {
            log.error("An error occured while trying to fetch manager emails from registry ", e);
            return null;
        }
        return json2ManagerUtils(responseStr);
    }

    class ManagersResponse {
        public List<ManagerUtils> response;

        public List<ManagerUtils> getResponse() {
            return response;
        }

        public void setResponse(List<ManagerUtils> response) {
            this.response = response;
        }
    }

    private List<ManagerUtils> json2ManagerUtils(String json){

        log.debug("Try to create List<ManagerUtils> from json: "+json);
        if (json == null){
            return null;
        }

        BufferedReader br = new BufferedReader(new StringReader(json));
        //convert the json string back to object
        Gson gson = new Gson();
        ManagersResponse managersResponse = null;
        List<ManagerUtils> managerUtilsList = null;

        try {
            ManagerUtils[] testCase = gson.fromJson(br, ManagerUtils[].class);
            managerUtilsList = Arrays.asList(testCase);
        }catch(Throwable e){
            log.debug("Error in parsing json response. Given json is : "+json, e);
            e.printStackTrace();
            return null;
        }

        log.debug("Original response.........: "+managerUtilsList.size());



        return managerUtilsList;
    }

    public Boolean isCommunityManager(String communityId, String userMail) {
        List<ManagerUtils> managerUtils = this.getManagersByEmail(communityId);
        if(managerUtils != null) {
            for(ManagerUtils manager : managerUtils) {
                if(manager.getEmail() != null && manager.getEmail().equals(userMail)) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public String toString() {
        return "ManagerUtils{" +
                "id='" + id + '\'' +
                ", email='" + email + '\'' +
                ", name='" + name + '\'' +
                ", memberSince='" + memberSince + '\'' +
                '}';
    }
}