package com.iqser.red.service.persistence.management.v1.processor.service;

import static com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter.convert;

import java.util.List;

import org.springframework.stereotype.Service;

import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateExportService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateImportService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.SystemManagedTypesImport;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ExportDownloadRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class DossierTemplateManagementService {

    private final DossierTemplateExportService dossierTemplateExportService;
    private final DossierTemplateImportService dossierTemplateImportService;
    private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
    private final DossierTemplateCloneService dossierTemplateCloneService;

    private final SystemManagedTypesImport systemManagedTypesImport;

    private final DictionaryManagementService dictionaryManagementService;


    public DossierTemplate createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest dossierTemplate) {

        DossierTemplate dossierTemplate1 = convert(dossierTemplatePersistenceService.createOrUpdateDossierTemplate(dossierTemplate), DossierTemplate.class);

        if (dossierTemplate.getDossierTemplateId() == null) {
            // import system managed entity types to this dossier template
            for (Type type : systemManagedTypesImport.getSystemManagedTypeList()) {

                type.setDossierTemplateId(dossierTemplate1.getId());
                type.setDossierId(null);
                dictionaryManagementService.addType(type);
            }
        }
        return dossierTemplate1;
    }


    public List<DossierTemplate> getAllDossierTemplates() {

        return convert(dossierTemplatePersistenceService.getAllDossierTemplates(), DossierTemplate.class);
    }


    public DossierTemplate getDossierTemplate(String dossierTemplateId) {

        return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class);
    }


    public void deleteDossierTemplate(String dossierTemplateId, String deletingUserId) {

        dossierTemplatePersistenceService.deleteDossierTemplate(dossierTemplateId, deletingUserId);
    }


    public DossierTemplate cloneDossierTemplate(String dossierTemplateId, CloneDossierTemplateRequest cloneDossierTemplateRequest) {

        return convert(dossierTemplateCloneService.cloneDossierTemplate(dossierTemplateId, cloneDossierTemplateRequest), DossierTemplate.class);
    }


    public JSONPrimitive<String> prepareExportDownload(ExportDownloadRequest request) {

        return dossierTemplateExportService.prepareExportDownload(request);
    }


    public DossierTemplate importDossierTemplate(ImportDossierTemplateRequest request) {

        String dossierTemplateId = dossierTemplateImportService.importDossierTemplate(request);
        return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class);
    }

}
