/*
 *******************************************************************************
 * 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.BadRequestException;
import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
import org.eclipse.openk.contactbasedata.mapper.CompanyMapper;
import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
import org.eclipse.openk.contactbasedata.mapper.ContactPersonMapper;
import org.eclipse.openk.contactbasedata.model.TblCompany;
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.CompanyDto;
import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Log4j2
@Service
public class CompanyService {
    @Autowired
    private CompanyRepository companyRepository;

    @Autowired
    private ContactRepository contactRepository;

    @Autowired
    private ContactPersonRepository contactPersonRepository;

    @Autowired
    private SalutationRepository salutationRepository;

    @Autowired
    private PersonTypeRepository personTypeRepository;

    @Autowired
    private CompanyMapper companyMapper;

    @Autowired
    private ContactPersonMapper contactPersonMapper;

    @Autowired
    private ContactMapper contactMapper;

    @Autowired
    private BaseContactService baseContactService;

    public CompanyDto findCompany(UUID contactUuid) {
        return companyMapper.toCompanyDto(
                companyRepository.findByTblContactUuid(contactUuid).orElseThrow(NotFoundException::new)
        );
    }

    public Page<CompanyDto> findCompanies(Pageable pageable) {
        return companyRepository.findAll(pageable).map(companyMapper::toCompanyDto);
    }


    @Transactional
    public CompanyDto insertCompany(CompanyDto companyDto) {
        TblContact contactToSave = new TblContact();
        contactToSave.setUuid(UUID.randomUUID());
        contactToSave.setContactType(Constants.CONTACT_TYPE_COMPANY);

        TblCompany companyToSave = companyMapper.toTblCompany(companyDto);
        companyToSave.setContact(contactToSave);
        contactRepository.save(companyToSave.getContact());

        setFromCompanyDto( companyToSave, companyDto );

        // Then save dependent Model-Object
        return companyMapper.toCompanyDto(companyRepository.save(companyToSave));
    }

    @Transactional
    public CompanyDto updateCompany(CompanyDto companyDto){
        TblCompany companyUpdated;

        TblCompany existingCompany = companyRepository
                .findByTblContactUuid(companyDto.getContactUuid())
                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));

        existingCompany.setCompanyName(companyDto.getCompanyName());
        existingCompany.setCompanyType(companyDto.getCompanyType());
        existingCompany.setHrNumber(companyDto.getHrNumber());

        setFromCompanyDto( existingCompany, companyDto );
        companyUpdated = companyRepository.save(existingCompany);

        return companyMapper.toCompanyDto(companyUpdated);
    }

    public List<ContactPersonDto> findContactPersonsToCompany( UUID companyContactUuid ) {
        TblCompany company = companyRepository.findByTblContactUuid( companyContactUuid )
                .orElseThrow( NotFoundException::new);
        return company.getContactPersons().stream()
                .map(contactPersonMapper::toContactPersonDto)
                .collect(Collectors.toList());
    }

    private void setFromCompanyDto( TblCompany destTblCompany, CompanyDto sourceDto ) {

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