package com.loremind.domain.lorecontext;

import lombok.Builder;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Entité de domaine représentant une page de contenu rattachée à un LoreNode.
 *
 * Une page :
 *  - appartient à un Lore (loreId — dénormalisé pour queries rapides)
 *  - est rangée sous un LoreNode (nodeId)
 *  - est générée depuis un Template (templateId) dont elle suit les `fields`
 *  - stocke les valeurs de ses champs dynamiques dans `values` (fieldName → value)
 *  - porte des métadonnées éditoriales : notes privées MJ, tags, liens inter-pages.
 *
 * Entité pure du domaine : aucune dépendance technique.
 */
@Data
@Builder
public class Page {

    private String id;
    private String loreId;
    private String nodeId;
    private String templateId;
    private String title;

    /** Valeurs des champs dynamiques définis par le Template. */
    private Map<String, String> values;

    /** Notes privées du MJ (non exportées vers FoundryVTT). */
    private String notes;

    /** Étiquettes libres pour regroupement/recherche. */
    private List<String> tags;

    /** IDs d'autres Pages liées (mêmes Lore ou cross-lore). */
    private List<String> relatedPageIds;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    // --- Méthodes métier --------------------------------------------------

    /** Met à jour la valeur d'un champ dynamique (création de la map si absente). */
    public void setFieldValue(String fieldName, String value) {
        if (values == null) {
            values = new HashMap<>();
        }
        values.put(fieldName, value);
        this.updatedAt = LocalDateTime.now();
    }

    public String getFieldValue(String fieldName) {
        return values == null ? null : values.get(fieldName);
    }

    public void addTag(String tag) {
        if (tag == null || tag.isBlank()) return;
        if (tags == null) tags = new ArrayList<>();
        if (!tags.contains(tag)) {
            tags.add(tag);
            this.updatedAt = LocalDateTime.now();
        }
    }

    public void removeTag(String tag) {
        if (tags != null && tags.remove(tag)) {
            this.updatedAt = LocalDateTime.now();
        }
    }

    public boolean hasTemplate() {
        return templateId != null && !templateId.isBlank();
    }
}
