package dev.lions.unionflow.server.entity;

import dev.lions.unionflow.server.api.enums.messagerie.TypePolitiqueCommunication;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.PrePersist;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * Politique de communication d'une organisation.
 *
 * <p>Chaque organisation possède exactement une politique, créée automatiquement
 * lors de la création de l'organisation avec les valeurs par défaut.
 * L'administrateur peut la modifier via l'API.
 *
 * <p>Table : {@code contact_policies}
 *
 * @author UnionFlow Team
 * @version 4.0
 * @since 2026-04-13
 */
@Entity
@Table(
    name = "contact_policies",
    indexes = {
        @Index(name = "idx_contact_policies_org", columnList = "organisation_id")
    },
    uniqueConstraints = {
        @UniqueConstraint(name = "uk_contact_policy_org", columnNames = "organisation_id")
    }
)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class ContactPolicy extends BaseEntity {

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organisation_id", nullable = false)
    private Organisation organisation;

    @Enumerated(EnumType.STRING)
    @Builder.Default
    @Column(name = "type_politique", nullable = false, length = 30)
    private TypePolitiqueCommunication typePolitique = TypePolitiqueCommunication.OUVERT;

    @Builder.Default
    @Column(name = "autoriser_membre_vers_membre", nullable = false)
    private Boolean autoriserMembreVersMembre = Boolean.TRUE;

    @Builder.Default
    @Column(name = "autoriser_membre_vers_role", nullable = false)
    private Boolean autoriserMembreVersRole = Boolean.TRUE;

    @Builder.Default
    @Column(name = "autoriser_notes_vocales", nullable = false)
    private Boolean autoriserNotesVocales = Boolean.TRUE;

    @PrePersist
    @Override
    protected void onCreate() {
        super.onCreate();
        if (typePolitique == null) {
            typePolitique = TypePolitiqueCommunication.OUVERT;
        }
        if (autoriserMembreVersMembre == null) {
            autoriserMembreVersMembre = Boolean.TRUE;
        }
        if (autoriserMembreVersRole == null) {
            autoriserMembreVersRole = Boolean.TRUE;
        }
        if (autoriserNotesVocales == null) {
            autoriserNotesVocales = Boolean.TRUE;
        }
    }
}
