namespace Apollinare.Domain.Entities;

/// <summary>
/// Rappresenta un modulo dell'applicazione (es. Magazzino, Acquisti, Vendite).
/// I moduli possono essere attivati/disattivati per gestire licenze e funzionalità.
/// </summary>
public class AppModule : BaseEntity
{
    /// <summary>
    /// Codice univoco del modulo (es. "warehouse", "purchases", "sales")
    /// </summary>
    public required string Code { get; set; }

    /// <summary>
    /// Nome visualizzato del modulo (es. "Magazzino", "Acquisti")
    /// </summary>
    public required string Name { get; set; }

    /// <summary>
    /// Descrizione estesa delle funzionalità del modulo
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// Nome dell'icona Material UI (es. "Warehouse", "ShoppingCart")
    /// </summary>
    public string? Icon { get; set; }

    /// <summary>
    /// Prezzo base annuale del modulo in EUR
    /// </summary>
    public decimal BasePrice { get; set; }

    /// <summary>
    /// Moltiplicatore per abbonamento mensile (es. 1.2 = 20% in più rispetto all'annuale/12)
    /// </summary>
    public decimal MonthlyMultiplier { get; set; } = 1.2m;

    /// <summary>
    /// Ordine di visualizzazione nel menu (più basso = prima)
    /// </summary>
    public int SortOrder { get; set; }

    /// <summary>
    /// Se true, il modulo fa parte del core e non può essere disattivato
    /// </summary>
    public bool IsCore { get; set; }

    /// <summary>
    /// Lista di codici modulo prerequisiti separati da virgola (es. "warehouse,purchases")
    /// </summary>
    public string? Dependencies { get; set; }

    /// <summary>
    /// Path base per le route frontend del modulo (es. "/warehouse")
    /// </summary>
    public string? RoutePath { get; set; }

    /// <summary>
    /// Se false, il modulo è nascosto e non disponibile per l'acquisto
    /// </summary>
    public bool IsAvailable { get; set; } = true;

    // Navigation property
    public ModuleSubscription? Subscription { get; set; }

    /// <summary>
    /// Restituisce la lista dei codici modulo prerequisiti
    /// </summary>
    public IEnumerable<string> GetDependencies()
    {
        if (string.IsNullOrWhiteSpace(Dependencies))
            return Enumerable.Empty<string>();

        return Dependencies.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
    }

    /// <summary>
    /// Calcola il prezzo mensile basato su BasePrice e MonthlyMultiplier
    /// </summary>
    public decimal GetMonthlyPrice()
    {
        return Math.Round((BasePrice / 12) * MonthlyMultiplier, 2);
    }
}
