/*
 *******************************************************************************
 * 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.exceptions.NotFoundException;
import org.eclipse.openk.contactbasedata.mapper.CommunicationTypeMapper;
import org.eclipse.openk.contactbasedata.model.RefCommunicationType;
import org.eclipse.openk.contactbasedata.repository.CommunicationTypeRepository;
import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Log4j2
@Service
public class CommunicationTypeService {

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

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

    @Autowired
    private CommunicationTypeRepository communicationTypeRepository;

    @Autowired
    private CommunicationTypeMapper communicationTypeMapper;


    public CommunicationTypeDto findCommunicationType(UUID communicationTypeUuid) {

        CommunicationTypeDto communicationTypeDto = communicationTypeMapper.
                        toCommunicationTypeDto(communicationTypeRepository.findByUuid(communicationTypeUuid).
                        orElseThrow(NotFoundException::new));

        if (Objects.equals(telephoneNumberId, communicationTypeDto.getId())
                || Objects.equals(mailId, communicationTypeDto.getId())) {
            communicationTypeDto.setMappingLdap(true);
        }

        return communicationTypeDto;
    }

    public List<CommunicationTypeDto> findCommunicationTypes() {

        List<CommunicationTypeDto> communicationTypeDtoList = communicationTypeRepository.findAll().stream()
                .map(communicationTypeMapper::toCommunicationTypeDto)
                .collect(Collectors.toList());

        for (CommunicationTypeDto communicationTypeDto : communicationTypeDtoList) {
            if (Objects.equals(telephoneNumberId, communicationTypeDto.getId())
                    || Objects.equals(mailId, communicationTypeDto.getId())) {
                communicationTypeDto.setMappingLdap(true);
            }
        }

        return communicationTypeDtoList;
    }

    @Transactional
    public CommunicationTypeDto insertCommunicationType(CommunicationTypeDto communicationTypeDto) {

        RefCommunicationType communicationTypeToSave = communicationTypeMapper.toRefCommunicationType(communicationTypeDto);
        communicationTypeToSave.setUuid(UUID.randomUUID());

        RefCommunicationType savedCommunicationType = communicationTypeRepository.save(communicationTypeToSave);

        return communicationTypeMapper.toCommunicationTypeDto(savedCommunicationType);
    }

    @Transactional
    public CommunicationTypeDto updateCommunicationType(CommunicationTypeDto communicationTypeDto){
        RefCommunicationType communicationTypeUpdated;

        RefCommunicationType existingCommunicationType = communicationTypeRepository
                .findByUuid(communicationTypeDto.getUuid())
                .orElseThrow(() -> new NotFoundException("communication.type.uuid.not.existing"));

        RefCommunicationType communicationTypeToSave = communicationTypeMapper.toRefCommunicationType(communicationTypeDto);
        communicationTypeToSave.setId(existingCommunicationType.getId());

        communicationTypeUpdated = communicationTypeRepository.save(communicationTypeToSave);

        return  communicationTypeMapper.toCommunicationTypeDto(communicationTypeUpdated);
    }

    @Transactional
    public void removeCommunicationType(UUID uuid) {
        RefCommunicationType existingCommunicationType  = communicationTypeRepository.findByUuid(uuid)
                .orElseThrow( () -> new NotFoundException("communication.type.uuid.not.existing"));

        communicationTypeRepository.delete(existingCommunicationType);
    }

}
