/*
 *******************************************************************************
 * 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 org.eclipse.openk.contactbasedata.config.TestConfiguration;
import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
import org.eclipse.openk.contactbasedata.model.TblCompany;
import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.repository.CompanyRepository;
import org.eclipse.openk.contactbasedata.repository.ContactRepository;
import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
import org.eclipse.openk.contactbasedata.support.MockDataHelper;
import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
import org.junit.jupiter.api.Test;
import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.ContextConfiguration;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

@DataJpaTest
@ContextConfiguration(classes = {TestConfiguration.class})

public class CompanyServiceTest {
    @Qualifier("myCompanyService")
    @Autowired
    private CompanyService companyService;

    @MockBean
    private CompanyRepository companyRepository;

    @MockBean
    private ContactRepository contactRepository;

    @MockBean
    private SalutationRepository salutationRepository;

    @MockBean
    private PersonTypeRepository personTypeRepository;

    @Test
    public void shouldFindACompanyProperly() {
        TblCompany ep = MockDataHelper.mockCompany();
        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(ep));
        CompanyDto dto = companyService.findCompany(UUID.randomUUID());

        assertEquals(ep.getContact().getUuid(), dto.getContactUuid());
    }

    @Test
    public void shouldThrowInErrorCaseWithCompany() {
        TblCompany ep = MockDataHelper.mockCompany();
        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
        assertThrows(NotFoundException.class, () -> companyService.findCompany(UUID.randomUUID()));
    }

    @Test
    public void shouldUpdateCompany() {
        CompanyDto epDto = MockDataHelper.mockCompanyDto();
        TblCompany epTbl = MockDataHelper.mockCompany();
        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(epTbl));
        when(salutationRepository.findByUuid(any(UUID.class)))
                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
        when(personTypeRepository.findByUuid(any(UUID.class)))
                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));

        when(companyRepository.save(any(TblCompany.class)))
                .then((Answer<TblCompany>) invocation -> {
                    Object[] args = invocation.getArguments();
                    return (TblCompany) args[0];
                });

        CompanyDto savedDto = companyService.updateCompany(epDto);
        assertEquals(epTbl.getContact().getUuid(), savedDto.getContactUuid());
        assertEquals(epTbl.getContact().getNote(), savedDto.getContactNote());
        assertEquals(epTbl.getContact().getContactType(), savedDto.getContactType());
        assertEquals(epTbl.getCompanyName(), savedDto.getCompanyName());
        assertEquals(epTbl.getCompanyType(), savedDto.getCompanyType());
    }

    @Test
    public void shouldNotUpdateCompany_Exception1() {
        CompanyDto epDto = MockDataHelper.mockCompanyDto();
        TblCompany epTbl = MockDataHelper.mockCompany();
        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
        when(salutationRepository.findByUuid(any(UUID.class)))
                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
        when(personTypeRepository.findByUuid(any(UUID.class)))
                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));

        when(companyRepository.save(any(TblCompany.class)))
                .then((Answer<TblCompany>) invocation -> {
                    Object[] args = invocation.getArguments();
                    return (TblCompany) args[0];
                });

        assertThrows( NotFoundException.class, () -> companyService.updateCompany(epDto));
    }

    @Test
    public void shouldInsertCompany() {
        CompanyDto epDto = MockDataHelper.mockCompanyDto();
        epDto.setContactUuid(null);

        when(contactRepository.save(any(TblContact.class)))
                .then((Answer<TblContact>) invocation -> {
                    Object[] args = invocation.getArguments();
                    return (TblContact) args[0];
                });
        when(companyRepository.save(any(TblCompany.class)))
                .then((Answer<TblCompany>) invocation -> {
                    Object[] args = invocation.getArguments();
                    return (TblCompany) args[0];
                });

        CompanyDto savedDto = companyService.insertCompany(epDto);
        assertNotNull(savedDto.getContactUuid());
        assertEquals(epDto.getContactNote(), savedDto.getContactNote());
        assertEquals(epDto.getContactType(), savedDto.getContactType());
        assertEquals(epDto.getCompanyName(), savedDto.getCompanyName());
        assertEquals(epDto.getCompanyType(), savedDto.getCompanyType());
    }

    @Test
    public void findContactPersonsToCompanyWithSuccess() {
        TblCompany company = MockDataHelper.mockCompany();
        company.setContactPersons( MockDataHelper.mockTblContactPersons());
        company.getContactPersons().get(1).getContact().setAnonymized(true);
        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(company));
        List<ContactPersonDto> cpDtos = companyService.findContactPersonsToCompany(UUID.randomUUID(), true);
        assertEquals(company.getContactPersons().size(), cpDtos.size());
        assertEquals(company.getContactPersons().get(1).getContact().getUuid(), cpDtos.get(1).getContactUuid());

        List<ContactPersonDto> cpDtos2 = companyService.findContactPersonsToCompany(UUID.randomUUID(), false);
        assertNotEquals(cpDtos.size(), cpDtos2.size());
    }


    @Test
    public void findContactPersonsToCompanyWithException() {
        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
        assertThrows( NotFoundException.class, ()-> companyService.findContactPersonsToCompany(UUID.randomUUID(), false));
    }
}