package br.gov.sigefp.budget.domain;

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

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

/**
 * Entidade que representa uma execução orçamentária.
 * Usa BigDecimal para valores financeiros.
 * Usa periodId (Long) para referência ao período de folha, desacoplando do módulo RH.
 */
@Entity
@Table(name = "budget_execution", indexes = {
    @Index(name = "idx_budget_execution_line", columnList = "budget_line_id"),
    @Index(name = "idx_budget_execution_period", columnList = "period_id"),
    @Index(name = "idx_budget_execution_created", columnList = "created_at"),
    @Index(name = "idx_budget_execution_source", columnList = "source_module,reference_id")
})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BudgetExecution extends BaseEntity {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "budget_line_id", nullable = false)
    private BudgetLine budgetLine;

    @Column(name = "period_id")
    private Long periodId; // Referência ao período de folha (rh.payroll_period) - desacoplado

    @Column(nullable = false, length = 50, name = "movement_type")
    private String movementType; // COMMITMENT, PAYMENT, REVERSAL - preparado para enum

    @Column(nullable = false, precision = 19, scale = 2)
    private BigDecimal amount;

    @Column(nullable = false, length = 50, name = "source_module")
    private String sourceModule; // rh, treasury, etc. - módulo que originou a execução

    @Column(name = "reference_id")
    private UUID referenceId; // ID da entidade no módulo de origem (ex: payment_id, payroll_item_id)
}


