package com.astalange.core.entity;

import jakarta.persistence.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "categorie", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"nom", "saison_id"})
})
public class Categorie {

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

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

    @Column(name = "annee_min")
    private Integer anneeMin;

    @Column(name = "annee_max")
    private Integer anneeMax;

    @Column(name = "tarif_base", nullable = false, precision = 10, scale = 2)
    private BigDecimal tarifBase;

    @Column(name = "tarif_exterieur", nullable = false, precision = 10, scale = 2)
    private BigDecimal tarifExterieur;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "saison_id", nullable = false)
    private Saison saison;

    @OneToMany(mappedBy = "categorie", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<CategorieEquipement> categorieEquipements = new ArrayList<>();

    // Getters and Setters

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getNom() { return nom; }
    public void setNom(String nom) { this.nom = nom; }

    public Integer getAnneeMin() { return anneeMin; }
    public void setAnneeMin(Integer anneeMin) { this.anneeMin = anneeMin; }

    public Integer getAnneeMax() { return anneeMax; }
    public void setAnneeMax(Integer anneeMax) { this.anneeMax = anneeMax; }

    public BigDecimal getTarifBase() { return tarifBase; }
    public void setTarifBase(BigDecimal tarifBase) { this.tarifBase = tarifBase; }

    public BigDecimal getTarifExterieur() { return tarifExterieur; }
    public void setTarifExterieur(BigDecimal tarifExterieur) { this.tarifExterieur = tarifExterieur; }

    public Saison getSaison() { return saison; }
    public void setSaison(Saison saison) { this.saison = saison; }

    public List<CategorieEquipement> getCategorieEquipements() { return categorieEquipements; }
    public void setCategorieEquipements(List<CategorieEquipement> categorieEquipements) { this.categorieEquipements = categorieEquipements; }

    @Transient
    public boolean hasEquipement(Long equipementId) {
        if (categorieEquipements == null) return false;
        return categorieEquipements.stream().anyMatch(ce -> ce.getEquipement() != null && ce.getEquipement().getId().equals(equipementId));
    }

    @Transient
    public boolean isEquipementObligatoire(Long equipementId) {
        if (categorieEquipements == null) return false;
        return categorieEquipements.stream().anyMatch(ce -> ce.getEquipement() != null && ce.getEquipement().getId().equals(equipementId) && Boolean.TRUE.equals(ce.getObligatoire()));
    }

    @Transient
    public BigDecimal getEquipementPrix(Long equipementId) {
        if (categorieEquipements == null) return BigDecimal.ZERO;
        return categorieEquipements.stream()
                .filter(ce -> ce.getEquipement() != null && ce.getEquipement().getId().equals(equipementId))
                .findFirst()
                .map(CategorieEquipement::getPrix)
                .orElse(BigDecimal.ZERO);
    }
}
