using OmsorgCore.Application.Abstractions;
using OmsorgCore.Infrastructure.Persistence;

namespace OmsorgCore.Infrastructure.Repositories;

/// <summary>
/// Generische Verwendungsprüfung für die Listen, deren Wert als einfaches String-Feld auf einer
/// anderen Entität gespeichert ist (Employee.Status/EmploymentType, Facility.CrmStatus/FacilityType,
/// Contract.ContractType/Status) — die Abfrage ist bei allen identisch ("wer hat dieses Feld == diesem
/// Wert"), nur Tabelle/Feld/Anzeige-Label unterscheiden sich, daher eine Klasse statt sechs fast
/// identischer Dateien. Für <c>OrderStatus</c> (FK statt String) siehe <see cref="OrderStatusValueListUsageChecker"/>.
/// </summary>
public class StringFieldValueListUsageChecker : IValueListUsageChecker
{
    private readonly OmsorgCoreDbContext _db;
    private readonly Func<OmsorgCoreDbContext, string, CancellationToken, Task<List<ValueListUsageEntry>>> _query;

    public string Key { get; }

    public StringFieldValueListUsageChecker(
        OmsorgCoreDbContext db,
        string key,
        Func<OmsorgCoreDbContext, string, CancellationToken, Task<List<ValueListUsageEntry>>> query)
    {
        _db = db;
        Key = key;
        _query = query;
    }

    public async Task<IReadOnlyList<ValueListUsageEntry>> FindUsagesAsync(Guid itemId, string itemValue, CancellationToken cancellationToken = default)
        => await _query(_db, itemValue, cancellationToken);
}
