package sn.ladoum.bergerie.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import sn.ladoum.bergerie.entity.enums.Sexe;
import sn.ladoum.bergerie.entity.enums.StatutMouton;

import java.time.LocalDate;

@Entity
@Table(name = "mouton")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Mouton {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * Identifiant fonctionnel unique au format "JJMMYYYY#id"
     * (ex: "02032026#1"). Généré à la création et backfillé pour les moutons existants.
     */
    @Column(name = "numero_identification", length = 50, unique = true)
    private String numeroIdentification;

    @Column(nullable = false, length = 100)
    private String nom;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, length = 20)
    private Sexe sexe;

    @Column(name = "date_naissance", nullable = false)
    private LocalDate dateNaissance;

    /** Date à laquelle le mouton a été enregistré dans le système (auto-fixée à la création). */
    @Column(name = "date_entree_systeme")
    private LocalDate dateEntreeSysteme;

    @Column(length = 50)
    private String race;

    @Column(length = 100)
    private String couleur;

    @Column(length = 500)
    private String caracteristiques;

    @Column(length = 500)
    private String photo;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, length = 20)
    private StatutMouton statut;

    /** Mâle désigné comme reproducteur (utilisé pour le choix du père). */
    @Column(nullable = false)
    @Builder.Default
    private Boolean reproducteur = false;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "pere_id")
    private Mouton pere;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "mere_id")
    private Mouton mere;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "eleveur_id")
    private Utilisateur eleveur;

    /**
     * Naissance à l'origine de ce mouton (null si créé manuellement via /moutons ou
     * avant l'introduction de cette relation).
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "naissance_id")
    private Naissance naissance;
}
