using OmsorgCore.Domain.Entities;

namespace OmsorgCore.Application.Services;

public interface IAbsenceService
{
    Task<(IReadOnlyList<Absence> Items, int TotalCount)> GetPagedAsync(
        string? status,
        string? type,
        Guid? employeeId,
        int page,
        int pageSize,
        CancellationToken cancellationToken = default);
    Task<Absence?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// Legt den Antrag an. Ist der aktuelle Nutzer nur mit Own-Scope berechtigt, wird
    /// <paramref name="absence"/>.EmployeeId ignoriert und serverseitig auf die eigene,
    /// per JWT verknüpfte Mitarbeiter-Id gesetzt - der Client kann sich nie als jemand
    /// anderes ausgeben. Gibt null zurück, wenn Own-Scope greift, aber kein Mitarbeiter
    /// verknüpft ist (fail-closed).
    /// </summary>
    Task<Absence?> CreateAsync(Absence absence, CancellationToken cancellationToken = default);

    /// <summary>
    /// Bearbeitet Zeitraum/Art/Grund/Vertretung/Nachricht - nur solange der Antrag noch nicht
    /// entschieden wurde (Status "Eingereicht"), sonst <see cref="UpdateAbsenceFailureReason.AlreadyDecided"/>.
    /// Own-Scope-Aufrufer dürfen nur ihre eigenen Anträge bearbeiten (wie bei GetByIdAsync).
    /// </summary>
    Task<UpdateAbsenceResult> UpdateAsync(Guid id, Absence updates, CancellationToken cancellationToken = default);

    Task<Absence?> DecideAsync(Guid id, string status, string? adminNote, CancellationToken cancellationToken = default);

    /// <summary>Der aktuell als "initial"/pending markierte Wert der ValueList "AbsenceStatus" (nicht hartkodiert, siehe AbsenceService).</summary>
    Task<string> GetInitialStatusValueAsync(CancellationToken cancellationToken = default);
    Task<bool> DeleteAsync(Guid id, CancellationToken cancellationToken = default);
    Task<IReadOnlyList<Absence>> GetDeletedAsync(string? search, CancellationToken cancellationToken = default);
    Task<bool> RestoreAsync(Guid id, CancellationToken cancellationToken = default);
}
