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 une Scene.
 * Unité de jeu la plus fine, subdivision d'un Chapter (ex: "Scène 1: L'auberge").
 * Entité pure du domaine, sans dépendance technique.
 */
@Data
@Builder
public class Scene {

    private String id;
    private String name;
    private String description;           // = Description courte dans l'UI
    private String chapterId;              // Référence vers le Chapter parent
    private int order;                     // Ordre de la scène dans le chapitre

    // === Contexte et ambiance ===
    private String location;               // Lieu de la scène (ex: Taverne du Dragon d'Or)
    private String timing;                 // Moment (ex: Soir, à la tombée de la nuit)
    private String atmosphere;             // Ambiance générale (sons, odeurs, émotions...)

    // === Narration pour les joueurs ===
    private String playerNarration;        // Texte lu directement aux joueurs

    // === Notes et secrets du MJ (privé) ===
    private String gmSecretNotes;          // Informations cachées, non visibles par les joueurs

    // === Choix et conséquences ===
    private String choicesConsequences;    // Options offertes aux joueurs et leurs conséquences

    // === Combat ou rencontre ===
    private String combatDifficulty;       // Difficulté estimée
    private String enemies;                // Liste des ennemis et créatures

    /**
     * IDs des pages du Lore associées à cette scène (weak cross-context references).
     * Très utile pour la préparation : épingler un lieu, un PNJ, une créature à une scène.
     */
    @Builder.Default
    private List<String> relatedPageIds = new ArrayList<>();

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

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

    public void linkPage(String pageId) {
        if (relatedPageIds == null) relatedPageIds = new ArrayList<>();
        if (!relatedPageIds.contains(pageId)) {
            relatedPageIds.add(pageId);
            this.updatedAt = LocalDateTime.now();
        }
    }

    public void unlinkPage(String pageId) {
        if (relatedPageIds != null && relatedPageIds.remove(pageId)) {
            this.updatedAt = LocalDateTime.now();
        }
    }
}
