package br.gov.sigefp.treasury.domain;

import br.gov.sigefp.common.domain.BaseEntity;
import jakarta.persistence.*;
import lombok.*;
import lombok.experimental.SuperBuilder;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * Entidade que representa uma ordem de pagamento.
 * Usa BigDecimal para valores financeiros e IDs para referências a outros
 * módulos.
 */
@Entity
@Table(name = "payment_order", indexes = {
        @Index(name = "idx_payment_order_batch", columnList = "payment_batch_id"),
        @Index(name = "idx_payment_order_payroll_run", columnList = "payroll_run_id"),
        @Index(name = "idx_payment_order_agent", columnList = "agent_id"),
        @Index(name = "idx_payment_order_status", columnList = "status")
})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class PaymentOrder extends BaseEntity {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "payment_batch_id", nullable = false)
    private PaymentBatch paymentBatch;

    @Column(name = "payroll_run_id")
    private UUID payrollRunId; // Referência à execução de folha (rh.payroll_run)

    @Column(name = "agent_id")
    private UUID agentId; // Referência ao agente (rh.agent)

    @Column(name = "bank_account_id")
    private UUID bankAccountId; // Referência à conta bancária (rh.agent_bank_account)

    @Column(name = "budget_line_id")
    private UUID budgetLineId; // Referência à linha orçamentária (para execução orçamentária)

    @Column(nullable = false, precision = 19, scale = 2, name = "gross_amount")
    private BigDecimal grossAmount; // Valor bruto

    @Column(nullable = false, precision = 19, scale = 2, name = "net_amount")
    private BigDecimal netAmount; // Valor líquido (após descontos)

    // --- Campos de Integridade Fiscal (RN03) ---
    @Column(nullable = false, precision = 19, scale = 2, name = "tax_amount")
    @Builder.Default
    private BigDecimal taxAmount = BigDecimal.ZERO; // Valor do Imposto Retido

    @Column(name = "tax_retention_type", length = 20)
    private String taxRetentionType; // Ex: IR_20, IVA_18, NONE

    @Column(name = "tax_collection_account_id")
    private UUID taxCollectionAccountId; // Conta de Arrecadação (DGI) para onde vai o imposto

    @Column(nullable = false, length = 20)
    @Builder.Default
    private String status = "CREATED"; // CREATED, SENT_TO_BANK, PAID, REJECTED - preparado para enum

    @OneToMany(mappedBy = "paymentOrder", cascade = CascadeType.ALL, orphanRemoval = true)
    @Builder.Default
    private List<TreasuryPayment> treasuryPayments = new ArrayList<>();
}
