using ROLAC.API.DTOs.MealAttendance;

namespace ROLAC.API.Services;

public interface IMealAttendanceService
{
    /// <summary>Today's date in the server's local time zone (the church's "current Sunday").</summary>
    DateOnly ServiceDay { get; }

    /// <summary>Returns the counts for <paramref name="date"/>, creating a zeroed row if none exists.</summary>
    Task<AttendanceCountsDto> GetOrCreateAsync(DateOnly date);

    /// <summary>
    /// Atomically adds <paramref name="delta"/> (may be negative) to one age-group column,
    /// clamped at zero, and returns the resulting authoritative counts.
    /// </summary>
    Task<AttendanceCountsDto> IncrementAsync(DateOnly date, string category, int delta);

    /// <summary>
    /// Sets one age-group column to an absolute <paramref name="value"/> (clamped at zero),
    /// overwriting the current count, and returns the resulting authoritative counts.
    /// </summary>
    Task<AttendanceCountsDto> SetAsync(DateOnly date, string category, int value);

    /// <summary>
    /// Overwrites all three age-group columns for <paramref name="date"/> with absolute
    /// values (each clamped at zero), creating the row if it does not exist, and returns
    /// the resulting authoritative counts. Used by the back-office Sunday-attendance editor.
    /// </summary>
    Task<AttendanceCountsDto> SetCountsAsync(DateOnly date, int adult, int youth, int kid);

    /// <summary>Returns the daily counts within the inclusive date range, ordered by date (for the dashboard).</summary>
    Task<IReadOnlyList<AttendanceCountsDto>> GetRangeAsync(DateOnly from, DateOnly to);
}
