namespace Apollinare.Domain.Entities;

/// <summary>
/// Configurazione per la generazione automatica di codici.
/// Ogni entità può avere la propria configurazione con pattern personalizzabile.
///
/// Pattern supportati:
/// - {SEQ:n} - Sequenza numerica con n cifre (es. {SEQ:5} → 00001)
/// - {YEAR} o {YYYY} - Anno corrente a 4 cifre
/// - {YY} - Anno corrente a 2 cifre
/// - {MONTH} o {MM} - Mese corrente a 2 cifre
/// - {DAY} o {DD} - Giorno corrente a 2 cifre
/// - {PREFIX} - Usa il prefisso definito
/// - Testo statico (es. "ART-", "-", "/")
///
/// Esempi di pattern:
/// - "ART-{YYYY}-{SEQ:5}" → ART-2025-00001
/// - "{PREFIX}{YY}{MM}{SEQ:4}" → MAG2511-0001
/// - "CLI/{YYYY}/{SEQ:6}" → CLI/2025/000001
/// </summary>
public class AutoCode : BaseEntity
{
    /// <summary>
    /// Codice univoco dell'entità (es. "warehouse_article", "warehouse_location", "cliente")
    /// </summary>
    public string EntityCode { get; set; } = string.Empty;

    /// <summary>
    /// Nome visualizzato dell'entità (es. "Articolo Magazzino", "Magazzino", "Cliente")
    /// </summary>
    public string EntityName { get; set; } = string.Empty;

    /// <summary>
    /// Prefisso opzionale da usare nel pattern con {PREFIX}
    /// </summary>
    public string? Prefix { get; set; }

    /// <summary>
    /// Pattern per la generazione del codice
    /// </summary>
    public string Pattern { get; set; } = "{PREFIX}{SEQ:5}";

    /// <summary>
    /// Ultimo numero di sequenza utilizzato (per {SEQ:n})
    /// </summary>
    public long LastSequence { get; set; } = 0;

    /// <summary>
    /// Se true, la sequenza viene resettata ogni anno
    /// </summary>
    public bool ResetSequenceYearly { get; set; } = false;

    /// <summary>
    /// Se true, la sequenza viene resettata ogni mese
    /// </summary>
    public bool ResetSequenceMonthly { get; set; } = false;

    /// <summary>
    /// Anno dell'ultimo reset della sequenza
    /// </summary>
    public int? LastResetYear { get; set; }

    /// <summary>
    /// Mese dell'ultimo reset della sequenza (se ResetSequenceMonthly)
    /// </summary>
    public int? LastResetMonth { get; set; }

    /// <summary>
    /// Se true, la generazione automatica è abilitata
    /// </summary>
    public bool IsEnabled { get; set; } = true;

    /// <summary>
    /// Se true, il codice non può essere modificato manualmente
    /// </summary>
    public bool IsReadOnly { get; set; } = false;

    /// <summary>
    /// Modulo di appartenenza (es. "core", "warehouse", "purchases")
    /// </summary>
    public string? ModuleCode { get; set; }

    /// <summary>
    /// Descrizione della configurazione
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// Ordine di visualizzazione nel pannello admin
    /// </summary>
    public int SortOrder { get; set; } = 0;

    /// <summary>
    /// Esempio di codice generato (calcolato, non persistito)
    /// </summary>
    public string GetExampleCode()
    {
        var now = DateTime.Now;
        return Pattern
            .Replace("{PREFIX}", Prefix ?? "")
            .Replace("{YEAR}", now.Year.ToString())
            .Replace("{YYYY}", now.Year.ToString())
            .Replace("{YY}", now.Year.ToString().Substring(2))
            .Replace("{MONTH}", now.Month.ToString("D2"))
            .Replace("{MM}", now.Month.ToString("D2"))
            .Replace("{DAY}", now.Day.ToString("D2"))
            .Replace("{DD}", now.Day.ToString("D2"))
            .Replace("{SEQ:1}", "X")
            .Replace("{SEQ:2}", "XX")
            .Replace("{SEQ:3}", "XXX")
            .Replace("{SEQ:4}", "XXXX")
            .Replace("{SEQ:5}", "XXXXX")
            .Replace("{SEQ:6}", "XXXXXX")
            .Replace("{SEQ:7}", "XXXXXXX")
            .Replace("{SEQ:8}", "XXXXXXXX");
    }
}
