package eu.dnetlib.openaire.rest;

import eu.dnetlib.openaire.rest.inputHandler.UserHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by sofia on 20/4/2017.
 */
public class Authorization {

    private static Logger logger = LogManager.getLogger(Authorization.class);
    List<String> registeredRoles = new ArrayList<String>(Arrays.asList("SUPER_ADMINISTRATOR", "PORTAL_ADMINISTRATOR", "EXPERT_COMMUNITY",
            "EXPERT_FUNDER", "CURATOR_CLAIM", "CURATOR_PROJECT", "CURATOR_COMMUNITY", "CURATOR_INSTITUTION", "AUTHOR", "REGISTERED_USER", "USER_MANAGER"));
    List<String> claimCuratorRoles = new ArrayList<String>(Arrays.asList("SUPER_ADMINISTRATOR", "CURATOR_CLAIM", "PORTAL_ADMINISTRATOR"));
    List<String> projectCuratorRoles = new ArrayList<String>(Arrays.asList("CURATOR_PROJECT"));
    List<String> communityCuratorRoles = new ArrayList<String>(Arrays.asList("CURATOR_COMMUNITY"));
    List<String> portalAdminRoles = new ArrayList<String>(Arrays.asList("PORTAL_ADMINISTRATOR"));
    UserHandler userHandler = null;
    String originServer = null;

    public boolean isRegistered(String token) {
        UserInfo userInfo = userHandler.getUserInfo(token);
        return isRegistered(userInfo);

    }
    public void logStatus(String cookie) {

       if(cookie == null || cookie.isEmpty()) {
            logger.debug("No proper value: cookie  \"AccessToken\" has value  " + cookie);
        }
    }

    public boolean isRegistered(UserInfo userInfo) {
        if (userInfo != null && userInfo.getRoles() != null) {

            return hasRole(userInfo.getAuthorities(), registeredRoles);
        } else {
            return false;
        }

    }

    public boolean isClaimCurator(String token) {
        UserInfo userInfo = userHandler.getUserInfo(token);
        return isClaimCurator(userInfo);

    }

    public boolean isClaimCurator(UserInfo userInfo) {
        if (userInfo != null && userInfo.getRoles() != null) {

            return hasRole(userInfo.getAuthorities(), claimCuratorRoles);
        } else {
            logger.debug(" User has no Valid UserInfo");
            return false;
        }

    }

    public boolean isCommunityCurator(String token) {
        UserInfo userInfo = userHandler.getUserInfo(token);
        return isCommunityCurator(userInfo);

    }

    public boolean isCommunityCurator(UserInfo userInfo) {
        if (userInfo != null && userInfo.getRoles() != null) {

            return hasRole(userInfo.getAuthorities(), communityCuratorRoles);
        } else {
            logger.debug(" User has no Valid UserInfo");
            return false;
        }

    }
    public boolean isProjectCurator(String token) {
        UserInfo userInfo = userHandler.getUserInfo(token);
        return isProjectCurator(userInfo);

    }

    public boolean isProjectCurator(UserInfo userInfo) {
        if (userInfo != null && userInfo.getRoles() != null) {

            return hasRole(userInfo.getAuthorities(), projectCuratorRoles);
        } else {
            return false;
        }

    }

    public boolean isPortalAdministrator(String token) {
        UserInfo userInfo = userHandler.getUserInfo(token);
        return isPortalAdministrator(userInfo);

    }

    public boolean isPortalAdministrator(UserInfo userInfo) {
        if (userInfo != null && userInfo.getRoles() != null) {

            return hasRole(userInfo.getAuthorities(), portalAdminRoles);
        } else {
            logger.debug(" User has no Valid UserInfo");
            return false;
        }

    }

    public boolean hasRole(List<String> givenRoles, List<String> authorizedRoles) {

//        logger.debug("It's  registered with role " + givenRoles);
        for (String gRole : givenRoles) {
            if (authorizedRoles.indexOf(gRole) != -1) {
                return true;
            }
        }
        logger.debug("Not Authorized. Authorized roles are" + authorizedRoles);
        return false;

    }

    public boolean hasValidOrigin(String origin) {
        logger.debug("Origin is "+origin +" originServer: "+originServer);
        if (origin != null && origin.indexOf(originServer)!=-1) {
            return true;
        }
        logger.debug("Not valid origin. Origin server is \"" + origin + "\", but expected value is \"" + originServer + "\". If the expec cted value is not right, check properties file. ");
        return false;
    }

    public boolean hasBasicAuthorization(String origin, String cookie){
        if(cookie == null || cookie.isEmpty() || !hasValidOrigin(origin)){
            return false;
        }
        return true;
    }

    public List<String> getRegisteredRoles() {
        return registeredRoles;
    }

    public void setRegisteredRoles(List<String> registeredRoles) {
        this.registeredRoles = registeredRoles;
    }

    public List<String> getClaimCuratorRoles() {
        return claimCuratorRoles;
    }

    public void setClaimCuratorRoles(List<String> claimCuratorRoles) {
        this.claimCuratorRoles = claimCuratorRoles;
    }

    public List<String> getCommunityCuratorRoles() {
        return communityCuratorRoles;
    }

    public void setCommunityCuratorRoles(List<String> communityCuratorRoles) {
        this.communityCuratorRoles = communityCuratorRoles;
    }

    public List<String> getProjectCuratorRoles() {
        return projectCuratorRoles;
    }

    public void setProjectCuratorRoles(List<String> projectCuratorRoles) {
        this.projectCuratorRoles = projectCuratorRoles;
    }

    public UserHandler getUserHandler() {
        return userHandler;
    }

    public void setUserHandler(UserHandler userHandler) {
        this.userHandler = userHandler;
    }

    public String getOriginServer() {
        return originServer;
    }

    public void setOriginServer(String originServer) {
        this.originServer = originServer;
    }
}
