package dev.lions.unionflow.server.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * Entité SuggestionVote pour gérer les votes sur les suggestions
 * 
 * <p>Permet d'éviter qu'un utilisateur vote plusieurs fois pour la même suggestion.
 * La contrainte d'unicité (suggestion_id, utilisateur_id) est gérée au niveau de la base de données.
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@Entity
@Table(
    name = "suggestion_votes",
    uniqueConstraints = {
        @UniqueConstraint(
            name = "uk_suggestion_vote",
            columnNames = {"suggestion_id", "utilisateur_id"}
        )
    },
    indexes = {
        @Index(name = "idx_vote_suggestion", columnList = "suggestion_id"),
        @Index(name = "idx_vote_utilisateur", columnList = "utilisateur_id")
    }
)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class SuggestionVote extends BaseEntity {

    @NotNull
    @Column(name = "suggestion_id", nullable = false)
    private UUID suggestionId;

    @NotNull
    @Column(name = "utilisateur_id", nullable = false)
    private UUID utilisateurId;

    @Column(name = "date_vote", nullable = false)
    @Builder.Default
    private LocalDateTime dateVote = LocalDateTime.now();

    @PrePersist
    protected void onPrePersist() {
        if (dateVote == null) {
            dateVote = LocalDateTime.now();
        }
        if (getDateCreation() == null) {
            setDateCreation(LocalDateTime.now());
        }
    }
}

