using System.IO; using AGEHAB.RelatorioSeadIpasgo.Application.Abstractions; using AGEHAB.RelatorioSeadIpasgo.Application.DTOs; using AGEHAB.RelatorioSeadIpasgo.Domain.Services; namespace AGEHAB.RelatorioSeadIpasgo.Application.UseCases; public class GerarRelatorioUseCase { private readonly IRelatorioRepository _repository; private readonly IIpasgoFiltroService _filtroIpasgoService; private readonly IExcelRelatorioWriter _excelWriter; private readonly IIpasgoZipWriter _zipWriter; public GerarRelatorioUseCase( IRelatorioRepository repository, IIpasgoFiltroService filtroIpasgoService, IExcelRelatorioWriter excelWriter, IIpasgoZipWriter zipWriter) { _repository = repository; _filtroIpasgoService = filtroIpasgoService; _excelWriter = excelWriter; _zipWriter = zipWriter; } public async Task ExecutarAsync(GerarRelatorioRequest request, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); GarantirDiretorio(request.ExcelPath); var linhas = await _repository.ObterRelatorioAsync(request.Competencia.Handle, request.TipoCalculo.Valor, cancellationToken); cancellationToken.ThrowIfCancellationRequested(); if (request.Relatorio.EhIpasgo) { if (string.IsNullOrWhiteSpace(request.ZipPath)) { throw new InvalidOperationException("Escolha onde salvar o ZIP do IPASGO."); } GarantirDiretorio(request.ZipPath); linhas = _filtroIpasgoService.Filtrar(linhas); cancellationToken.ThrowIfCancellationRequested(); SubstituirArquivo(request.ZipPath); _zipWriter.Escrever(request.Competencia.Referencia, linhas, request.ZipPath, cancellationToken); } cancellationToken.ThrowIfCancellationRequested(); SubstituirArquivo(request.ExcelPath); _excelWriter.Escrever(request.Relatorio.TituloExcel, linhas, request.ExcelPath, cancellationToken); } private static void GarantirDiretorio(string filePath) { var diretorio = Path.GetDirectoryName(filePath); if (!string.IsNullOrWhiteSpace(diretorio) && !Directory.Exists(diretorio)) { Directory.CreateDirectory(diretorio); } } private static void SubstituirArquivo(string filePath) { if (File.Exists(filePath)) { File.Delete(filePath); } } }