/*
 *******************************************************************************
 * Copyright (c) 2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************
 */
package org.eclipse.openk.contactbasedata.service;

import lombok.extern.log4j.Log4j2;
import org.eclipse.openk.contactbasedata.constants.Constants;
import org.eclipse.openk.contactbasedata.exceptions.InternalServerErrorException;
import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.viewmodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Date;
import java.util.UUID;

@Log4j2
@Service
public class ContactAnonymizerService {
    @Autowired
    ContactService contactService;

    @Autowired
    private CompanyService companyService;

    @Autowired
    private ExternalPersonService externalPersonService;

    @Autowired
    private InternalPersonService internalPersonService;

    @Autowired
    private ContactPersonService contactPersonService;

    @Autowired
    private AddressService addressService;

    @Autowired
    private CommunicationService communicationService;

    @Transactional
    public void anonymize( UUID contactUuid ) {
        TblContact tblContact = contactService.findTblContact(contactUuid);

        switch( tblContact.getContactType() ) {
            case Constants.CONTACT_TYPE_COMPANY:
                anonymizeCompany( tblContact.getUuid() );
                break;
            case Constants.CONTACT_TYPE_INTERNAL_PERSON:
                anonymizeInternalPerson( tblContact.getUuid() );
                break;
            case Constants.CONTACT_TYPE_EXTERNAL_PERSON:
                anonymizeExternalPerson( tblContact.getUuid() );
                break;
            case Constants.CONTACT_TYPE_CONTACT_PERSON:
                anonymizeContactPerson( tblContact.getUuid() );
                break;
            default:
                log.warn("Invalid Contact Type: "+tblContact.getContactType()+"for contact: "+contactUuid);
                throw new InternalServerErrorException("Invalid contact type found");
        }
    }

    private void anonymizeCompany( UUID contactUuid ) {
        CompanyDto dto = companyService.findCompany(contactUuid);
        dto.setCompanyName(Constants.ANONYMOUS_TAG);
        dto.setCompanyType(null);
        dto.setContactNote(getContactNote());
        dto.setContactAnonymized(true);
        companyService.updateCompany(dto);

        // kill 'em all
        companyService.findContactPersonsToCompany(contactUuid, false).stream()
                .forEach(contactPersonDto -> anonymizeContactPerson(contactPersonDto.getContactUuid()));

        processDependencies(contactUuid);
    }

    private void anonymizeInternalPerson( UUID contactUuid ) {
        InternalPersonDto internalPersonDto = internalPersonService.findInternalPerson(contactUuid);
        internalPersonDto.setLastName(Constants.ANONYMOUS_TAG);
        internalPersonDto.setFirstName(null);
        internalPersonDto.setTitle(null);
        internalPersonDto.setDepartment(null);
        internalPersonDto.setUid(null);
        internalPersonDto.setUserRef(null);
        internalPersonDto.setSalutationUuid(null);
        internalPersonDto.setContactNote(getContactNote());
        internalPersonDto.setContactAnonymized(true);

        internalPersonService.updateInternalPerson(internalPersonDto);

        processDependencies(contactUuid);
    }

    private void anonymizeExternalPerson( UUID contactUuid ) {
        ExternalPersonDto externalPersonDto = externalPersonService.findExternalPerson(contactUuid);
        externalPersonDto.setLastName(Constants.ANONYMOUS_TAG);
        externalPersonDto.setFirstName(null);
        externalPersonDto.setTitle(null);
        // leave personType untouched
        externalPersonDto.setSalutationUuid(null);
        externalPersonDto.setContactNote(getContactNote());
        externalPersonDto.setContactAnonymized(true);
        externalPersonService.updateExternalPerson(externalPersonDto);

        processDependencies(contactUuid);
    }

    private void anonymizeContactPerson( UUID contactUuid ) {
        ContactPersonDto contactPersonDto = contactPersonService.findContactPerson(contactUuid);
        contactPersonDto.setLastName(Constants.ANONYMOUS_TAG);
        contactPersonDto.setFirstName(null);
        contactPersonDto.setTitle(null);
        // leave personType untouched
        contactPersonDto.setSalutationUuid(null);
        contactPersonDto.setContactNote(getContactNote());
        contactPersonDto.setContactAnonymized(true);
        contactPersonService.updateContactPerson(contactPersonDto);

        processDependencies(contactUuid);
    }

    private void processDependencies(UUID contactUuid) {
        addressService.getAddressesByContactUuid(contactUuid).stream()
                .forEach(this::anonymizeAddress);

        communicationService.getCommunicationsByContactUuid(contactUuid).stream()
                .forEach(this::anonymizeCommunication);
    }

    private void anonymizeAddress( AddressDto addressDto ) {
        addressDto.setCommunity(Constants.ANONYMOUS_TAG);
        addressDto.setStreet(Constants.ANONYMOUS_TAG);
        addressDto.setCommunitySuffix(null);
        addressDto.setHousenumber(null);
        addressDto.setLatitude(null);
        addressDto.setLongitude(null);
        addressDto.setNote(null);
        addressDto.setPostcode(null);
        addressDto.setUrlMap(null);
        addressDto.setNote(Constants.ANONYMOUS_TAG);

        addressService.updateAddress(addressDto.getContactUuid(), addressDto);
    }

    private void anonymizeCommunication(CommunicationDto communicationDto ) {
        communicationDto.setCommunicationData(Constants.ANONYMOUS_TAG);
        communicationDto.setCommunicationTypeDescription(null);
        communicationDto.setNote(Constants.ANONYMOUS_TAG);

        communicationService.updateCommunication(communicationDto.getContactUuid(), communicationDto);
    }

    private static String getContactNote() {
        return new StringBuilder()
                .append("*** [")
                .append(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(Date.from(Instant.now())))
                .append("] ***")
                .toString();
    }

}
