/*
 *******************************************************************************
 * 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.NotFoundException;
import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
import org.eclipse.openk.contactbasedata.mapper.ContactPersonMapper;
import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.model.TblContactPerson;
import org.eclipse.openk.contactbasedata.repository.*;
import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@Log4j2
@Service
public class ContactPersonService {

    @Autowired
    private ContactRepository contactRepository;

    @Autowired
    private ContactPersonRepository contactPersonRepository;

    @Autowired
    private CompanyRepository companyRepository;

    @Autowired
    private SalutationRepository salutationRepository;

    @Autowired
    private PersonTypeRepository personTypeRepository;

    @Autowired
    private ContactPersonMapper contactPersonMapper;

    @Autowired
    private ContactMapper contactMapper;


    public ContactPersonDto findContactPerson(UUID contactPersonUuid) {
        TblContactPerson tblContactPerson = contactPersonRepository
                                                            .findByTblContactUuid(contactPersonUuid)
                                                            .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
       return contactPersonMapper.toContactPersonDto(tblContactPerson);
    }

    @Transactional
    public ContactPersonDto insertContactPerson(ContactPersonDto contactPersonDto) {
        TblContact contactToSave = new TblContact();
        contactToSave.setUuid(UUID.randomUUID());
        contactToSave.setContactType(Constants.CONTACT_TYPE_CONTACT_PERSON);

        TblContactPerson contactPersonToSave = contactPersonMapper.toTblContactPerson(contactPersonDto);
        contactPersonToSave.setContact(contactToSave);
        contactRepository.save(contactPersonToSave.getContact());

        setFromContactPersonDto( contactPersonToSave, contactPersonDto );

        // Then save dependent Model-Object
        return contactPersonMapper.toContactPersonDto(contactPersonRepository.save(contactPersonToSave));
    }

    @Transactional
    public ContactPersonDto updateContactPerson(ContactPersonDto contactPersonDto){
        TblContactPerson contactPersonUpdated;

        TblContactPerson existingContactPerson = contactPersonRepository
                .findByTblContactUuid(contactPersonDto.getContactUuid())
                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));

        existingContactPerson.setLastName(contactPersonDto.getLastName());
        existingContactPerson.setFirstName(contactPersonDto.getFirstName());
        existingContactPerson.setTitle(contactPersonDto.getTitle());

        setFromContactPersonDto( existingContactPerson, contactPersonDto );
        contactPersonUpdated = contactPersonRepository.save(existingContactPerson);

        return contactPersonMapper.toContactPersonDto(contactPersonUpdated);
    }

    @Transactional
    public void deleteContactPerson(UUID contactUuid) {
        TblContact tblContact = contactRepository.findByUuid(contactUuid)
                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
        TblContactPerson tblContactPerson = contactPersonRepository.findByTblContactUuid(contactUuid)
                .orElseThrow(() -> new NotFoundException("contact.person.uuid.not.existing"));

        contactPersonRepository.delete(tblContactPerson);
        contactRepository.delete(tblContact);
    }

    private void setFromContactPersonDto( TblContactPerson destTblContactPerson, ContactPersonDto sourceDto ) {

        if( sourceDto.getSalutationUuid() != null ) {
            destTblContactPerson.setSalutation( salutationRepository
                    .findByUuid(sourceDto.getSalutationUuid())
                    .orElseThrow(() -> new NotFoundException("salutation.uuid.not.existing")));
        }
        else {
            destTblContactPerson.setSalutation(null);
        }

        if( sourceDto.getPersonTypeUuid() != null ) {
            destTblContactPerson.setRefPersonType( personTypeRepository
                    .findByUuid(sourceDto.getPersonTypeUuid())
                    .orElseThrow(() -> new NotFoundException("person.type.uuid.not.existing")));
        }
        else {
            destTblContactPerson.setRefPersonType(null);
        }

        if( sourceDto.getCompanyContactUuid() != null ) {
            destTblContactPerson.setCompany( companyRepository
                    .findByTblContactUuid(sourceDto.getCompanyContactUuid())
                    .orElseThrow(() -> new NotFoundException("company.contact.uuid.not.existing")));
        }
        else {
            destTblContactPerson.setRefPersonType(null);
        }

        destTblContactPerson.getContact().setNote(sourceDto.getContactNote());
    }
}
