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

namespace OmsorgCore.Infrastructure.Repositories;

/// <summary>
/// Verwendungsprüfung für die Liste "OrderStatus" — anders als die übrigen Listen wird dieser Wert
/// über eine echte Fremdschlüsselbeziehung referenziert (<c>Order.StatusId</c>), zusätzlich können
/// Übergangsregeln (<c>ValueListItemTransition</c>) auf den Status verweisen.
/// </summary>
public class OrderStatusValueListUsageChecker : IValueListUsageChecker
{
    private readonly OmsorgCoreDbContext _db;

    public string Key => "OrderStatus";

    public OrderStatusValueListUsageChecker(OmsorgCoreDbContext db)
    {
        _db = db;
    }

    public async Task<IReadOnlyList<ValueListUsageEntry>> FindUsagesAsync(Guid itemId, string itemValue, CancellationToken cancellationToken = default)
    {
        var orderUsages = await _db.Orders.AsNoTracking()
            .Where(o => o.StatusId == itemId)
            .Select(o => new ValueListUsageEntry("Order", o.Id, $"Auftrag {o.Id} ({o.Facility.Name})"))
            .ToListAsync(cancellationToken);

        var transitionUsages = await _db.ValueListItemTransitions.AsNoTracking()
            .Where(t => t.FromItemId == itemId || t.ToItemId == itemId)
            .Select(t => new ValueListUsageEntry("OrderStatusTransition", t.Id, $"Übergang {t.FromItem.Value} → {t.ToItem.Value}"))
            .ToListAsync(cancellationToken);

        return orderUsages.Concat(transitionUsages).ToList();
    }
}
