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.model.DownloadJob;
import com.iqser.red.service.persistence.management.v1.processor.service.export.DossierTemplateExportService;
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.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest;

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;


    public DossierTemplate createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest dossierTemplate) {

        return convert(dossierTemplatePersistenceService.createOrUpdateDossierTemplate(dossierTemplate), DossierTemplate.class);
    }


    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 void createExportDownload(String userId, String storageId) {

        dossierTemplateExportService.createDownloadArchive(DownloadJob.builder().userId(userId).storageId(storageId).build());
    }


    public DossierTemplate importDossierTemplate(ImportDossierTemplateRequest request) {

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

}
