package br.gov.sigefp.treasury.repository;

import br.gov.sigefp.treasury.domain.TreasuryPlan;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * Repository para gestão de Planos de Tesouraria.
 */
@Repository
public interface TreasuryPlanRepository extends JpaRepository<TreasuryPlan, UUID> {
    
    /**
     * Encontra o plano ativo para uma data específica.
     */
    @Query("SELECT tp FROM TreasuryPlan tp WHERE tp.status = 'APPROVED' " +
           "AND :date >= tp.startDate AND :date <= tp.endDate")
    Optional<TreasuryPlan> findActivePlanForDate(@Param("date") LocalDate date);
    
    /**
     * Encontra todos os planos aprovados para um período.
     */
    @Query("SELECT tp FROM TreasuryPlan tp WHERE tp.status = 'APPROVED' " +
           "AND tp.startDate <= :endDate AND tp.endDate >= :startDate")
    List<TreasuryPlan> findApprovedPlansForPeriod(@Param("startDate") LocalDate startDate, 
                                                   @Param("endDate") LocalDate endDate);
    
    /**
     * Encontra planos por status.
     */
    List<TreasuryPlan> findByStatus(String status);
    
    /**
     * Encontra planos por ano fiscal e mês de referência.
     */
    @Query("SELECT tp FROM TreasuryPlan tp WHERE tp.fiscalYear = :fiscalYear " +
           "AND tp.referenceMonth = :referenceMonth")
    Optional<TreasuryPlan> findByFiscalYearAndReferenceMonth(@Param("fiscalYear") Integer fiscalYear,
                                                              @Param("referenceMonth") Integer referenceMonth);
    
    /**
     * Calcula o total executado para um plano específico.
     * Soma todos os pagamentos autorizados relacionados ao período do plano.
     */
    @Query("SELECT COALESCE(SUM(po.grossAmount), 0) FROM PaymentOrder po " +
           "WHERE po.paymentBatch.id IN " +
           "(SELECT pb.id FROM PaymentBatch pb WHERE pb.status = 'SENT_TO_BANK' OR pb.status = 'EXECUTED') " +
           "AND po.createdAt >= :startDate AND po.createdAt <= :endDate")
    java.math.BigDecimal calculateExecutedAmountForPeriod(@Param("startDate") LocalDate startDate,
                                                           @Param("endDate") LocalDate endDate);
}

