package com.iqser.red.service.peristence.v1.server.integration.service;

import static org.assertj.core.api.Assertions.assertThat;

import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.google.common.collect.Sets;
import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient;
import com.iqser.red.service.peristence.v1.server.integration.client.RulesClient;
import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel;
import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequestModel;

@Service
public class DossierTemplateTesterAndProvider {

    @Autowired
    private DossierTemplateClient dossierTemplateClient;

    @Autowired
    private RulesClient rulesClient;

    @Autowired
    private LegalBasisClient legalBasisClient;

    @Autowired
    private DictionaryClient dictionaryClient;


    public Colors provideDefaultColors(String dossierTemplateId) {

        return dictionaryClient.getColors(dossierTemplateId);
    }


    public DossierTemplateModel provideTestTemplate() {

        return provideTestTemplate("Template 1", false);
    }


    public DossierTemplateModel provideTestTemplate(boolean ocrByDefault) {

        return provideTestTemplate("Template 1", ocrByDefault);
    }


    public DossierTemplateModel provideTestTemplate(String name) {

        return provideTestTemplate(name, false);
    }


    public DossierTemplateModel provideTestTemplate(String name, boolean ocrByDefault) {

        var cru = new DossierTemplateModel();
        cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL));
        cru.setName(name);
        cru.setDescription("Template 1");
        cru.setValidFrom(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
        cru.setValidTo(OffsetDateTime.now().plusHours(1).truncatedTo(ChronoUnit.MILLIS));
        cru.setOcrByDefault(ocrByDefault);

        var result = dossierTemplateClient.createOrUpdateDossierTemplate(cru);

        assertThat(result.getName()).isEqualTo(name);

        var loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getDossierTemplateId());

        assertThat(loadedTemplate).isEqualTo(result);

        rulesClient.upload(new RulesUploadRequestModel("ABCD", loadedTemplate.getDossierTemplateId(), RuleFileType.ENTITY));
        legalBasisClient.setLegalBasisMapping(List.of(new LegalBasis("name", "description", "reason")), loadedTemplate.getDossierTemplateId());

        loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getDossierTemplateId());

        return loadedTemplate;
    }

}
