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

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

import jakarta.transaction.Transactional;

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.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository;
import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class ReportTemplatePersistenceService {

    private final ReportTemplateRepository reportTemplateRepository;
    private final DossierTemplateRepository dossierTemplateRepository;


    public void insert(String dossierTemplateId, String templateId, String storageId, String templateName, boolean activeByDefault, boolean multiFileReport) {

        ReportTemplateEntity reportTemplate = new ReportTemplateEntity();
        reportTemplate.setTemplateId(templateId);
        reportTemplate.setDossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId));
        reportTemplate.setStorageId(storageId);
        reportTemplate.setFileName(templateName);
        reportTemplate.setMultiFileReport(multiFileReport);
        reportTemplate.setActiveByDefault(activeByDefault);
        reportTemplate.setUploadDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));

        reportTemplateRepository.save(reportTemplate);

    }


    @Transactional
    public void delete(String templateId) {

        reportTemplateRepository.deleteById(templateId);
    }


    public List<ReportTemplateEntity> findByDossierTemplateId(String dossierTemplateId) {

        return reportTemplateRepository.findAllByDossierTemplateId(dossierTemplateId);

    }


    public ReportTemplateEntity find(String templateId) {

        return reportTemplateRepository.findById(templateId).orElseThrow(() -> new NotFoundException("Report Template not found: " + templateId));

    }


    @Transactional
    public void updateTemplate(String dossierTemplateId, String templateId, ReportTemplateUpdateRequest updateRequest) {

        int countUpdate = reportTemplateRepository.updateReportTemplate(dossierTemplateId,
                templateId,
                updateRequest.getFileName(),
                updateRequest.isMultiFileReport(),
                updateRequest.isActiveByDefault());
        if (countUpdate == 0) {
            throw new NotFoundException("Report Template not found for dossier template Id: " + dossierTemplateId + " and templateId: " + templateId);
        }
    }

}
