/*
 *******************************************************************************
 * 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.enums.OperationType;
import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
import org.eclipse.openk.contactbasedata.exceptions.OperationDeniedException;
import org.eclipse.openk.contactbasedata.mapper.AddressMapper;
import org.eclipse.openk.contactbasedata.mapper.AssignmentModulContactMapper;
import org.eclipse.openk.contactbasedata.model.TblAddress;
import org.eclipse.openk.contactbasedata.model.TblAssignmentModulContact;
import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.repository.AddressRepository;
import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
import org.eclipse.openk.contactbasedata.repository.AssignmentModulContactRepository;
import org.eclipse.openk.contactbasedata.repository.ContactRepository;
import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
import org.eclipse.openk.contactbasedata.viewmodel.AssignmentModulContactDto;
import org.springframework.beans.factory.annotation.Autowired;
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 AssignmentModulContactService {
    @Autowired
    private AssignmentModulContactRepository assignmentModulContactRepository;

    @Autowired
    private ContactRepository contactRepository;

    @Autowired
    AssignmentModulContactMapper assignmentModulContactMapper;

    public List<AssignmentModulContactDto> getAssignments(UUID contactUuid) {
        List<TblAssignmentModulContact> tblAssignmentsList = assignmentModulContactRepository
                .findByTblContactUuid(contactUuid);

        return tblAssignmentsList.stream().map(assignmentModulContactMapper::toAssignmentModulContactDto).collect(Collectors.toList());
    }

    @Transactional
    public AssignmentModulContactDto insertAssignment(UUID contactUuid, AssignmentModulContactDto assignmentDto) {

        TblContact tblContact = contactRepository
                                .findByUuid(contactUuid)
                                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));

        TblAssignmentModulContact assignmentToSave = assignmentModulContactMapper.toTblAssignmentModulContact(assignmentDto);
        assignmentToSave.setUuid(UUID.randomUUID());
        assignmentToSave.setTblContact(tblContact);

        if ( !checkUniqueAssignmentForContactAndModuleForInsert(tblContact.getId(), assignmentDto.getModulName())) {
            throw new OperationDeniedException(OperationType.INSERT, "assignment.already.existing");
        }

        TblAssignmentModulContact savedAssignment = assignmentModulContactRepository.save(assignmentToSave);
        return assignmentModulContactMapper.toAssignmentModulContactDto(savedAssignment);
    }

    @Transactional
    public AssignmentModulContactDto updateAssignment(UUID contactUuid, AssignmentModulContactDto assignmentDto) {

        TblContact contact = contactRepository.findByUuid(contactUuid)
                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));

        TblAssignmentModulContact tblAssignment = assignmentModulContactRepository.findByUuid(assignmentDto.getUuid())
                .orElseThrow(() -> new NotFoundException("assignment.uuid.not.existing"));

        TblAssignmentModulContact assignmentToSave = assignmentModulContactMapper.toTblAssignmentModulContact(assignmentDto);
        assignmentToSave.setTblContact(contact);
        assignmentToSave.setId(tblAssignment.getId());

        if ( !checkUniqueAssignmentForContactAndModuleForUpdate(contact.getId(), assignmentDto.getUuid(), assignmentDto.getModulName())) {
            throw new OperationDeniedException(OperationType.UPDATE, "assignment.already.existing");
        }

        TblAssignmentModulContact savedAssignment = assignmentModulContactRepository.save(assignmentToSave);
        return assignmentModulContactMapper.toAssignmentModulContactDto(savedAssignment);
    }


    @Transactional
    public void deleteAssignment(UUID contactUuid, UUID assignmentUuid) {
        TblContact tblContact = contactRepository.findByUuid(contactUuid)
                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
        TblAssignmentModulContact tblAssignment = assignmentModulContactRepository.findByTblContactAndUuid(tblContact, assignmentUuid)
                .orElseThrow(() -> new NotFoundException("assignment.uuid.not.existing"));

        assignmentModulContactRepository.delete(tblAssignment);
    }

    private boolean checkUniqueAssignmentForContactAndModuleForInsert(Long contactId, String modulName){
        return assignmentModulContactRepository.countByContactIdAndModuleName(contactId, modulName) == 0;
    }

    private boolean checkUniqueAssignmentForContactAndModuleForUpdate( Long contactId, UUID assignmentUuid, String modulName){
       Long result = assignmentModulContactRepository.countByContactIdAndUuidAndModulNameIsNotSame(contactId, assignmentUuid, modulName) ;
       return result==0;
    }




}
