package com.loremind.domain.campaigncontext;

import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * Entité de domaine représentant un Arc narratif.
 * Division majeure d'une Campaign (ex: "L'arc sombre").
 * Entité pure du domaine, sans dépendance technique.
 */
@Data
@Builder
public class Arc {

    private String id;
    private String name;
    private String description;      // = Synopsis dans l'UI
    private String campaignId;       // Référence vers la Campaign parente
    private int order;               // Ordre de l'arc dans la campagne

    // Champs narratifs enrichis (voir docs/maquettes/campagne/détail/)
    private String themes;           // Thèmes principaux explorés dans cet arc
    private String stakes;           // Enjeux globaux pour les personnages
    private String gmNotes;          // Notes privées du MJ (non exportées vers FoundryVTT)
    private String rewards;          // Récompenses et progression
    private String resolution;       // Dénouement prévu

    /**
     * IDs des pages du Lore associées à cet arc (weak cross-context references).
     * Permet au MJ de lier des PNJ, lieux ou lore items qui jouent un rôle dans cet arc.
     * Ne contient que des IDs ; pas d'import du Lore Context (respect des Bounded Contexts).
     * Initialisé en {@link ArrayList} vide dans le builder pour éviter les NPE.
     */
    @Builder.Default
    private List<String> relatedPageIds = new ArrayList<>();

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    // ─────────────── Méthodes métier ───────────────

    /** Ajoute un lien vers une page du Lore (idempotent : pas de doublon). */
    public void linkPage(String pageId) {
        if (relatedPageIds == null) relatedPageIds = new ArrayList<>();
        if (!relatedPageIds.contains(pageId)) {
            relatedPageIds.add(pageId);
            this.updatedAt = LocalDateTime.now();
        }
    }

    /** Retire un lien vers une page du Lore (sans erreur si absent). */
    public void unlinkPage(String pageId) {
        if (relatedPageIds != null && relatedPageIds.remove(pageId)) {
            this.updatedAt = LocalDateTime.now();
        }
    }
}
