using MudBlazor;
using SteUp.Shared.Core.Entities;

namespace SteUp.Shared.Core.Helpers;

/// <summary>
/// Stato di sincronizzazione di una scheda rispetto al server Integry.
/// Principio "Offline è la verità": il rilevatore deve sempre vedere cosa è
/// ancora solo sul dispositivo e cosa è già arrivato al server.
/// </summary>
public enum SyncState
{
    /// Salvata solo in locale, non ancora inviata al server.
    DaInviare = 0,

    /// Inviata al server (ha un ActivityId).
    Inviato = 1
}

public static class SchedaSyncHelper
{
    public static SyncState GetSyncState(this Scheda scheda) =>
        string.IsNullOrEmpty(scheda.ActivityId) ? SyncState.DaInviare : SyncState.Inviato;

    public static string ToLabel(this SyncState state) =>
        state switch
        {
            SyncState.DaInviare => "Da inviare",
            SyncState.Inviato => "Inviato",
            _ => string.Empty
        };

    /// <summary>
    /// Colore del badge. Corallo (Primary) = azione richiesta (da inviare);
    /// verde (Success) = fatto (inviato). Rispetta la Regola dell'Unico Accento.
    /// </summary>
    public static Color GetColor(this SyncState state) =>
        state switch
        {
            SyncState.DaInviare => Color.Primary,
            SyncState.Inviato => Color.Success,
            _ => Color.Default
        };

    public static string GetIcon(this SyncState state) =>
        state switch
        {
            SyncState.DaInviare => Icons.Material.Rounded.PhonelinkOff,
            SyncState.Inviato => Icons.Material.Rounded.CloudDone,
            _ => string.Empty
        };

    /// Numero di schede non ancora inviate in una lista.
    public static int CountDaInviare(this IEnumerable<Scheda> schede) =>
        schede.Count(s => s.GetSyncState() == SyncState.DaInviare);
}
