package eu.dnetlib.openaire.user.utils;

import eu.dnetlib.openaire.user.dao.RoleVerificationDAO;
import eu.dnetlib.openaire.user.pojos.RoleVerification;
import eu.dnetlib.openaire.user.store.DataSourceConnector;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

@Component(value = "managerVerificationActions")
public class ManagerVerificationActions {

    @Autowired
    private DataSourceConnector dataSourceConnector;

    private Logger logger = Logger.getLogger(ManagerVerificationActions.class);

    @Autowired
    private RoleVerificationDAO roleVerificationDAO;

    public RoleVerification get(String id) {
        try {
            return roleVerificationDAO.fetchById(id);
        } catch (SQLException e) {
            logger.error("Fail get verification entry.", e);
            return null;
        }
    }

    public RoleVerification addManagerVerification(String id, String email, String type, String entity, String verificationCode, Timestamp date) {
        return addVerification(id, email, type, entity, "manager", verificationCode, date);
    }

    public RoleVerification addMemberVerification(String id, String email, String type, String entity, String verificationCode, Timestamp date) {
        return addVerification(id, email, type, entity, "member", verificationCode, date);
    }

    private RoleVerification addVerification(String id, String email, String type, String entity, String verificationType, String verificationCode, Timestamp date) {
        try {
            RoleVerification roleVerification = new RoleVerification();
            roleVerification.setId(id);
            roleVerification.setEmail(email);
            roleVerification.setVerificationCode(verificationCode);
            roleVerification.setVerificationType(verificationType);
            roleVerification.setType(type);
            roleVerification.setEntity(entity);
            roleVerification.setDate(date);
            if (roleVerificationDAO.insert(roleVerification) > 0) {
                logger.info("Insert user: " + email);
                return roleVerification;
            } else {
                return null;
            }
        } catch (SQLException e) {
            logger.error("Fail to insert user.", e);
            return null;
        }
    }

    public void delete(String id) {
        try {
            roleVerificationDAO.delete(id);
            logger.info("Delete entry with id : " + id);
        } catch (SQLException e) {
            logger.error("Fail to delete user.", e);
        }
    }

    public boolean exists(String id) {
        try {
            RoleVerification roleVerification = roleVerificationDAO.fetchById(id);
            return roleVerification != null;
        } catch (SQLException e) {
            return false;
        }
    }

    public RoleVerification getManagerVerification(String email, String type, String entity) {
        try {
            return roleVerificationDAO.getManagerVerification(email, type, entity);
        } catch (SQLException e) {
            logger.error("Fail to search user.", e);
        }
        return null;
    }

    public RoleVerification getMemberVerification(String email, String type, String entity) {
        try {
            return roleVerificationDAO.getMemberVerification(email, type, entity);
        } catch (SQLException e) {
            logger.error("Fail to search user.", e);
        }
        return null;
    }

    public List<String> getInvitedManagers(String type, String entity) {
        try {
            return roleVerificationDAO.getInvitedManagers(type, entity);
        } catch (SQLException e) {
            logger.error("Fail to search user.", e);
        }
        return new ArrayList<>();
    }

    public List<String> getInviteMembers(String type, String entity) {
        try {
            return roleVerificationDAO.getInvitedMembers(type, entity);
        } catch (SQLException e) {
            logger.error("Fail to search user.", e);
        }
        return new ArrayList<>();
    }

    public DataSourceConnector getDataSourceConnector() {
        return dataSourceConnector;
    }

    public void setDataSourceConnector(DataSourceConnector dataSourceConnector) {
        this.dataSourceConnector = dataSourceConnector;
    }
}
