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

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

import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.UUID;

import org.springframework.stereotype.Service;

import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils;
import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest;
import com.iqser.red.storage.commons.service.StorageService;
import com.knecon.fforesight.tenantcommons.TenantContext;

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

@Slf4j
@Service
@RequiredArgsConstructor
public class ReportTemplateService {

    private final StorageService storageService;
    private final ReportTemplatePersistenceService reportTemplatePersistenceService;


    public ReportTemplate uploadTemplate(ReportTemplateUploadRequest reportTemplateUploadRequest) {

        String templateId = null;
        List<ReportTemplateEntity> reportTemplates = reportTemplatePersistenceService.findByDossierTemplateId(reportTemplateUploadRequest.getDossierTemplateId());
        for (ReportTemplateEntity reportTemplate : reportTemplates) {
            if (reportTemplate.getFileName()
                    .equals(reportTemplateUploadRequest.getFileName()) && reportTemplate.isMultiFileReport() && reportTemplateUploadRequest.isMultiFileReport() || reportTemplate.getFileName()
                    .equals(reportTemplateUploadRequest.getFileName()) && !reportTemplate.isMultiFileReport() && !reportTemplateUploadRequest.isMultiFileReport()) {
                templateId = reportTemplate.getTemplateId();
            }
        }

        String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), reportTemplateUploadRequest.getFileName());
        storageService.storeObject(TenantContext.getTenantId(), storageId, new ByteArrayInputStream(reportTemplateUploadRequest.getTemplate()));

        if (templateId != null) {
            reportTemplatePersistenceService.updateTemplate(reportTemplateUploadRequest.getDossierTemplateId(),
                    templateId,
                    ReportTemplateUpdateRequest.builder()
                            .fileName(reportTemplateUploadRequest.getFileName())
                            .multiFileReport(reportTemplateUploadRequest.isMultiFileReport())
                            .activeByDefault(reportTemplateUploadRequest.isActiveByDefault())
                            .build());
        } else {
            templateId = UUID.randomUUID().toString();
            reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(),
                    templateId,
                    storageId,
                    reportTemplateUploadRequest.getFileName(),
                    reportTemplateUploadRequest.isActiveByDefault(),
                    reportTemplateUploadRequest.isMultiFileReport());
        }

        return convert(reportTemplatePersistenceService.find(templateId), ReportTemplate.class);
    }

}
