using DeepDrftModels.Enums;

namespace DeepDrftModels.DTOs;

/// <summary>
/// Aggregate figures behind the public home hero stat row (NowPlayingStats). A single read returns
/// everything the three cards need so the client makes one round-trip. The track-domain counts exclude
/// soft-deleted rows; the play-domain figures (Phase 16) come from the event domain.
/// </summary>
public class HomeStatsDto
{
    /// <summary>Total non-deleted tracks whose release is the Cut medium. The Studio Cuts card's primary figure.</summary>
    public int CutTrackCount { get; set; }

    /// <summary>
    /// Per-ReleaseType counts of non-deleted Cut releases. Only types with at least one release are
    /// present — a zero-count type is absent from the list (the card suppresses it). The Studio Cuts
    /// card's secondary breakdown.
    /// </summary>
    public List<CutReleaseTypeCount> CutReleaseTypeCounts { get; set; } = [];

    /// <summary>Total non-deleted releases of the Mix medium. The Mixes card's primary figure ("N Sets").</summary>
    public int MixReleaseCount { get; set; }

    /// <summary>
    /// Sum of DurationSeconds across all non-deleted tracks on Mix releases. Tracks with a null
    /// duration (not yet backfilled) contribute 0. The Mixes card's secondary figure, rendered hh:mm.
    /// </summary>
    public double MixRuntimeSeconds { get; set; }

    /// <summary>
    /// Site-wide total plays across all tracks — the sum of every play_counter's bucket columns
    /// (partial + sampled + complete), all-time (Phase 16 §5). The Plays card's primary odometer figure.
    /// Reads zero until the play-telemetry migration is applied; that is expected, not an error.
    /// </summary>
    public long TotalPlays { get; set; }

    /// <summary>
    /// Site-wide distinct anonymous listeners — distinct non-null anon_id across all play events,
    /// all-time (Phase 16 §3 / D7). The Plays card's secondary line ("N listeners"). Over-counts by
    /// design (one token per browser-install, honestly labelled "listeners").
    /// </summary>
    public int UniqueListeners { get; set; }
}

/// <summary>One row of the Cut release-type breakdown: a ReleaseType and how many Cut releases have it.</summary>
public class CutReleaseTypeCount
{
    public ReleaseType ReleaseType { get; set; }
    public int Count { get; set; }
}
