package org.eclipse.openk.contactbasedata.service;

import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang.StringUtils;
import org.eclipse.openk.contactbasedata.model.RefCommunicationType;
import org.eclipse.openk.contactbasedata.model.TblCommunication;
import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
import org.eclipse.openk.contactbasedata.repository.CommunicationRepository;
import org.eclipse.openk.contactbasedata.repository.CommunicationTypeRepository;
import org.eclipse.openk.contactbasedata.repository.InternalPersonRepository;
import org.eclipse.openk.contactbasedata.service.util.LdapUserAttributesMapper;
import org.eclipse.openk.contactbasedata.viewmodel.LdapUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;

import static org.springframework.ldap.query.LdapQueryBuilder.query;

@Log4j2
@Service
public class LdapService {

    @Value("${authnauth-sync.scheduling.enabled}")
    private Boolean ldapEnabled;

    @Value("${ldap-sync.attribute-mapping.uid}")
    private String uid;

    @Value("${ldap-sync.db-id-mapping.telephone-number-id}")
    private Long telephoneNumberId;

    @Value("${ldap-sync.db-id-mapping.mail-id}")
    private Long mailId;

    @Autowired
    LdapUserAttributesMapper ldapUserAttributesMapper;

    @Autowired
    private InternalPersonRepository internalPersonRepository;

    @Autowired
    private LdapTemplate ldapTemplate;

    @Autowired
    private CommunicationTypeRepository communicationTypeRepository;

    @Autowired
    CommunicationRepository communicationRepository;

    /**
     * Retrieves all the LdapUsers in the ldap server, using {@link LdapUserAttributesMapper}
     * @return list of LdapUsers
     */
    public List<LdapUser> getAllLdapUsers() {
        return ldapEnabled.booleanValue()
                ? ldapTemplate.search(query().where("objectclass").is("person"), ldapUserAttributesMapper)
                : new ArrayList<>();
    }

    /**
     * Retrieves the distinct the LdapUsers from the ldap server, using {@link LdapUserAttributesMapper}
     * @return ldapUsers
     */
    public List<LdapUser> getLdapUserByUID(String uid) {
        return ldapTemplate.search(query()
                .where("objectclass").is("person").and(this.uid).is(uid), ldapUserAttributesMapper);
    }

    @Transactional
    public void synchronizeLDAP() {
        List<TblInternalPerson> internalPersonList = internalPersonRepository.findByUidIdentNotNull();

        Map<String, TblInternalPerson> uidToInternalPersonMap = internalPersonList.stream().collect(
                Collectors.toMap(TblInternalPerson::getUidIdent, Function.identity()));

        List<LdapUser> allFoundLdapUsers = new ArrayList<>();
        List<TblInternalPerson> allNotExistingLdapUsers = new ArrayList<>();
        findExistingAndNotExistingLdapUsers(internalPersonList, allFoundLdapUsers, allNotExistingLdapUsers);

        List<TblInternalPerson> internalPersonListSynchronized = new ArrayList<>();

        RefCommunicationType refCommunicationTypeMail = getRefCommunicationType(mailId);
        RefCommunicationType refCommunicationTypePhone = getRefCommunicationType(telephoneNumberId);

        for (LdapUser ldapUser : allFoundLdapUsers) {
            TblInternalPerson tblInternalPerson = uidToInternalPersonMap.get(ldapUser.getUid());
            if (tblInternalPerson == null) continue;
            boolean attributesChanged = mapLdapUserToInternaPerson(tblInternalPerson, ldapUser, refCommunicationTypeMail, refCommunicationTypePhone);
            if (attributesChanged) {
                internalPersonListSynchronized.add(tblInternalPerson);
            }
        }

        //Update all not found users notes with the sync error message
        internalPersonRepository.saveAll(allNotExistingLdapUsers);

        //Update all found Users with the synchronized LDAP data
        internalPersonRepository.saveAll(internalPersonListSynchronized);

        log.info("Synchronization changed data of: " + internalPersonListSynchronized.size() + " internal user/s");
        log.info("Attribute/s of the following internal user/s were updated:");
        for (TblInternalPerson tblInternalPerson : internalPersonListSynchronized) {
            log.info("Id: " + tblInternalPerson.getId() + " Firstname: " + tblInternalPerson.getFirstName() + " Lastname: " + tblInternalPerson.getLastName());
        }
    }

    private RefCommunicationType getRefCommunicationType(Long refCommunicationTypeId) {
        return communicationTypeRepository.findAll().stream()
                .filter(x -> x.getId().equals(refCommunicationTypeId))
                .findFirst().orElse(null);
    }

    private void findExistingAndNotExistingLdapUsers(List<TblInternalPerson> internalPersonList, List<LdapUser> allFoundLdapUsers, List<TblInternalPerson> allNotExistingLdapUsers) {
        for (TblInternalPerson tblInternalPerson : internalPersonList) {
            String uidTblInternalPerson = tblInternalPerson.getUidIdent();
            List<LdapUser> ldapUserByUIDResult = getLdapUserByUID(uidTblInternalPerson);

            if(ldapUserByUIDResult.isEmpty()){
                String errorMsg = String.format("[LDAP Sync Error] User with Uid: [ %s ] can not be found in LDAP", uidTblInternalPerson);
                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, errorMsg);
            }
            else if(ldapUserByUIDResult.size() > 1){
                String errorMsg = String.format("[LDAP Sync Error] More than one result for UID: [ %s ] in LDAP", uidTblInternalPerson);
                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, errorMsg);
            }
            else {
                LdapUser ldapUser = ldapUserByUIDResult.get(0);
                allFoundLdapUsers.add(ldapUser);
            }
        }
    }

    private void setNoteAndLogSyncError(List<TblInternalPerson> allNotExistingLdapUsers, TblInternalPerson tblInternalPerson, String errorMsg) {
        log.error(errorMsg);
        String note = tblInternalPerson.getContact().getNote();
        if (note == null) note = "";
        if (!note.contains(errorMsg)) {
            note = note + System.lineSeparator() + errorMsg;
            tblInternalPerson.getContact().setNote(note);
            allNotExistingLdapUsers.add(tblInternalPerson);
        }
    }

    private boolean mapLdapUserToInternaPerson(TblInternalPerson tblInternalPerson, LdapUser ldapUser, RefCommunicationType refCommunicationTypeMail, RefCommunicationType refCommunicationTypePhone) {
        boolean attributesChanged = false;

        attributesChanged = isCommunicationDataChangedAndSync(tblInternalPerson, ldapUser.getMail(), refCommunicationTypeMail, attributesChanged, mailId);
        attributesChanged = isCommunicationDataChangedAndSync(tblInternalPerson, ldapUser.getTelephoneNumber(), refCommunicationTypePhone, attributesChanged, telephoneNumberId);

        if (!Objects.equals(tblInternalPerson.getFirstName(), ldapUser.getFirstName())
                || !Objects.equals(tblInternalPerson.getLastName(), ldapUser.getLastName())
                || !Objects.equals(tblInternalPerson.getTitle(), ldapUser.getTitle())
                || !Objects.equals(tblInternalPerson.getDepartment(), ldapUser.getDepartment())) {
            attributesChanged = true;
            tblInternalPerson.setFirstName(ldapUser.getFirstName());
            tblInternalPerson.setLastName(ldapUser.getLastName());
            tblInternalPerson.setTitle(ldapUser.getTitle());
            tblInternalPerson.setDepartment(ldapUser.getDepartment());
        }
        return attributesChanged;
    }

    private boolean isCommunicationDataChangedAndSync(TblInternalPerson tblInternalPerson, String communicationdata, RefCommunicationType refCommunicationType, boolean attributesChanged, Long communicationTypeId) {
        if (refCommunicationType == null || communicationTypeId == -1L) return false;
        List<TblCommunication> tblCommunicationList = tblInternalPerson.getContact().getCommunications();

        Optional<TblCommunication> optionalTblCommunication = tblCommunicationList.stream()
                .filter(tblCommunication -> tblCommunication.getRefCommunicationType().getId().equals(communicationTypeId))
                .findFirst();

        if (optionalTblCommunication.isPresent()) {
            if (!Objects.equals(optionalTblCommunication.get().getCommunicationData(), communicationdata)){
                optionalTblCommunication.get().setCommunicationData(communicationdata);
                attributesChanged = true;
            }
        } else {
            attributesChanged = createAndSaveNewTblCommunication(tblInternalPerson, communicationdata, refCommunicationType, attributesChanged);
        }
        return attributesChanged;
    }

    private boolean createAndSaveNewTblCommunication(TblInternalPerson tblInternalPerson, String communicationData, RefCommunicationType refCommunicationType, boolean attributesChanged) {
        if (StringUtils.isEmpty(communicationData)) return attributesChanged;
        TblCommunication tblCommunication = new TblCommunication();
        tblCommunication.setUuid(UUID.randomUUID());
        tblCommunication.setTblContact(tblInternalPerson.getContact());
        tblCommunication.setRefCommunicationType(refCommunicationType);
        tblCommunication.setCommunicationData(communicationData);
        communicationRepository.save(tblCommunication);
        tblInternalPerson.getContact().getCommunications().add(tblCommunication);
        return true;
    }


}
