DailyChallenge.java

package com.wavii.model;

import com.wavii.model.enums.Level;
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDate;

/**
 * Entidad que representa un desafío diario en la plataforma.
 * Cada día se generan desafíos basados en tablaturas de la comunidad (PdfDocument)
 * segmentados por nivel de dificultad y posición (slot).
 */
@Entity
@Table(
    name = "daily_challenges",
    uniqueConstraints = @UniqueConstraint(columnNames = {"challenge_date", "difficulty", "slot"})
)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DailyChallenge {

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

    /** Fecha para la que es valido este desafio */
    @Column(name = "challenge_date", nullable = false)
    private LocalDate challengeDate;

    /**
     * Dificultad del desafio: coincide con el nivel del usuario para el que esta pensado.
     * PRINCIPIANTE = 1, INTERMEDIO = 2, AVANZADO = 3
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Level difficulty;

    /** Posicion del desafio dentro del bloque diario de su nivel (1..4) */
    private Integer slot;

    /** XP que otorga completar este desafio */
    @Column(nullable = false)
    private int xpReward;

    /** Tablatura de la comunidad asignada como desafio */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "pdf_document_id", nullable = false)
    private PdfDocument pdfDocument;
}