package io.gmss.fiscad.entities.infocad.parametre;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.gmss.fiscad.entities.BaseEntity;
import io.gmss.fiscad.entities.decoupage.Arrondissement;
import io.gmss.fiscad.entities.decoupage.Quartier;
import io.gmss.fiscad.entities.decoupage.Secteur;
import io.gmss.fiscad.entities.decoupage.SecteurDecoupage;
import io.gmss.fiscad.entities.infocad.metier.Enquete;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

/**
 * Un bloc représente un secteur de découpage admin dans le cadre d'une enquete fiscale
 */
@EqualsAndHashCode(callSuper = true)
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@SQLDelete(sql =
        "UPDATE bloc " +
                "SET deleted = true " +
                "WHERE id = ?")
@Where(clause = " deleted = false")
public class Bloc extends BaseEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(updatable = false)
    private String cote;
    private String coteq;
    private String nom;
    @JsonIgnore
    private String idBlocParArrondissement;
    @JsonIgnore
    @Transient
    private String nomArrondissement;
    @ManyToMany
    @JoinTable(name = "blocs_quartiers",
            joinColumns = @JoinColumn(name = "bloc_id"),
            inverseJoinColumns = @JoinColumn(name = "quartier_id")
    )
    private Set<Quartier> quartiers;

    @NotNull
    @ManyToOne
    private Arrondissement arrondissement;

    @OneToOne
    private Quartier quartier;

    @ManyToOne
    private Structure structure;
    @JsonIgnore
    @OneToMany(mappedBy = "bloc")
    private List<Enquete> enquetes;

    @ManyToOne
    private SecteurDecoupage secteurDecoupage;

    //@JsonIgnore
    @ManyToOne
    private Secteur secteur;

    public String getNomArrondissement() {
        return arrondissement.getNom();
    }

}
