package br.gov.sigefp.rh.domain;

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

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

/**
 * Entidade que representa um agente/funcionário público.
 */
@Entity
@Table(name = "agents", indexes = {
        @Index(name = "idx_agent_nif", columnList = "nif"),
        @Index(name = "idx_agent_bi", columnList = "bi_number"),
        @Index(name = "idx_agent_matricula", columnList = "matricula"),
        @Index(name = "idx_agent_status", columnList = "status")
})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class Agent extends AuditableEntity {

    @Column(nullable = false, unique = true, length = 20)
    private String matricula; // Número de matrícula único

    @Column(nullable = false, unique = true, length = 20)
    private String nif; // Número de Identificação Fiscal

    @Column(nullable = false, unique = true, length = 20, name = "bi_number")
    private String biNumber; // Número do Bilhete de Identidade

    @Column(nullable = false, length = 200)
    private String fullName;

    @Column(nullable = false)
    private LocalDate birthDate;

    @Column(nullable = false)
    private LocalDate hireDate; // Data de admissão

    @Column(name = "posse_date")
    private LocalDate posseDate; // Data de posse

    private LocalDate terminationDate; // Data de desligamento (null se ativo)

    @Column(nullable = false, length = 50, name = "appointment_type")
    private String appointmentType = "PROVISORIA"; // PROVISORIA, DEFINITIVA, CONTRATO_PROVIMENTO, CONTRATO_TERMO

    @Column(nullable = false, length = 50, name = "functional_situation")
    private String functionalSituation = "ATIVIDADE_NO_QUADRO"; // ATIVIDADE_NO_QUADRO, ATIVIDADE_FORA_DO_QUADRO...

    @Column(name = "eligible_dependents_count")
    private Integer eligibleDependentsCount; // Número de dependentes para Abono de Família

    @Column(nullable = false, length = 20)
    private String status = "REGISTERED"; // REGISTERED, ACTIVE, INACTIVE, SUSPENDED, TERMINATED

    @Column(name = "literary_qualification", length = 100)
    private String literaryQualification; // Habilitação Literária

    @Column(name = "salary_category_id")
    private UUID salaryCategory;

    @Column(name = "salary_grade_id")
    private UUID salaryGrade;

    @Column(name = "salary_step_id")
    private UUID salaryStep;

    @Column(name = "org_unit_id")
    private UUID orgUnit; // Referência à unidade organizacional

    @Column(name = "position_id")
    private UUID position; // Referência à posição/cargo

    @Column(length = 50)
    private String nationality;

    @Column(length = 20)
    private String phone;

    @Column(length = 100)
    private String email;

    @Column(length = 500)
    private String address;

    @OneToMany(mappedBy = "agent", cascade = CascadeType.ALL, orphanRemoval = true)
    @lombok.Builder.Default
    private List<AgentContract> contracts = new ArrayList<>();

    @OneToMany(mappedBy = "agent", cascade = CascadeType.ALL, orphanRemoval = true)
    @lombok.Builder.Default
    private List<AgentBankAccount> bankAccounts = new ArrayList<>();

    @OneToMany(mappedBy = "agent", cascade = CascadeType.ALL, orphanRemoval = true)
    @lombok.Builder.Default
    private List<AgentDeductionRule> deductionRules = new ArrayList<>();

}
