package dev.lions.unionflow.server.api.dto.finance_workflow.request;

import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * DTO de requête pour créer un budget
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-03-13
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CreateBudgetRequest {

    @NotBlank(message = "Le nom est requis")
    @Size(max = 200, message = "Le nom ne peut pas dépasser 200 caractères")
    private String name;

    @Size(max = 1000, message = "La description ne peut pas dépasser 1000 caractères")
    private String description;

    @NotNull(message = "L'ID de l'organisation est requis")
    private UUID organizationId;

    @NotBlank(message = "La période est requise")
    @Pattern(regexp = "^(MONTHLY|QUARTERLY|SEMIANNUAL|ANNUAL)$",
            message = "Période invalide")
    private String period;

    @NotNull(message = "L'année est requise")
    @Min(value = 2020, message = "L'année doit être >= 2020")
    @Max(value = 2100, message = "L'année doit être <= 2100")
    private Integer year;

    @Min(value = 1, message = "Le mois doit être entre 1 et 12")
    @Max(value = 12, message = "Le mois doit être entre 1 et 12")
    private Integer month;

    @NotNull(message = "Au moins une ligne budgétaire est requise")
    @Size(min = 1, message = "Au moins une ligne budgétaire est requise")
    @Valid
    @Builder.Default
    private List<CreateBudgetLineRequest> lines = new ArrayList<>();

    @Pattern(regexp = "^[A-Z]{3}$", message = "Code devise invalide (doit être ISO 3 lettres)")
    private String currency; // Optionnel, défaut XOF
}
