package com.loremind.domain.campaigncontext;

import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * Entité de domaine représentant une Campaign.
 * Conteneur global pour organiser la narration d'une campagne.
 * Entité pure du domaine, sans dépendance technique.
 */
@Data
@Builder
public class Campaign {

    private String id;
    private String name;
    private String description;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
    private int arcsCount;

    /**
     * Référence faible (weak reference) vers un Lore.
     * Nullable : une campagne peut exister sans univers associé (one-shot, test, pitch libre).
     * Ce n'est qu'un ID : le Campaign Context ne dépend PAS du Lore Context
     * (respect des Bounded Contexts en DDD).
     */
    private String loreId;

    /** Associe cette campagne à un Lore existant. */
    public void linkToLore(String loreId) {
        this.loreId = loreId;
        this.updatedAt = LocalDateTime.now();
    }

    /** Retire l'association à un Lore (la campagne redevient "universe-agnostic"). */
    public void unlinkFromLore() {
        this.loreId = null;
        this.updatedAt = LocalDateTime.now();
    }

    public boolean isLinkedToLore() {
        return this.loreId != null && !this.loreId.isBlank();
    }

    // Méthode métier pour gérer le nombre d'arcs
    public void incrementArcsCount() {
        this.arcsCount++;
        this.updatedAt = LocalDateTime.now();
    }

    public void decrementArcsCount() {
        if (this.arcsCount > 0) {
            this.arcsCount--;
            this.updatedAt = LocalDateTime.now();
        }
    }
}
