using QuantEngine.Application.Interfaces;
using QuantEngine.Core.Interfaces;

namespace QuantEngine.Application.Services;

public sealed class CollectionReadModelService : ICollectionReadModelService
{
    private readonly ICollectionReadRepository _repository;

    public CollectionReadModelService(ICollectionReadRepository repository)
    {
        _repository = repository;
    }

    public Task<CollectionDashboardStateRecord> GetDashboardStateAsync() => _repository.GetDashboardStateAsync();

    public Task<List<CollectionRunRecord>> GetRecentRunsAsync(int limit = 20)
        => _repository.GetRecentRunsAsync(NormalizeLimit(limit, 1, 200));

    public Task<List<CollectionSnapshotRecord>> GetRunSnapshotsAsync(string runId)
        => _repository.GetRunSnapshotsAsync(RequireValue(runId, nameof(runId)));

    public Task<List<CollectionErrorRecord>> GetRunErrorsAsync(string runId, int limit = 50)
        => _repository.GetRunErrorsAsync(RequireValue(runId, nameof(runId)), NormalizeLimit(limit, 1, 200));

    public Task<List<CollectionSnapshotRecord>> GetLatestSnapshotsForTickerAsync(string ticker, int limit = 10)
        => _repository.GetLatestSnapshotsForTickerAsync(RequireValue(ticker, nameof(ticker)), NormalizeLimit(limit, 1, 100));

    public Task<List<PriceHistorySummaryRecord>> GetPriceHistorySummaryAsync() => _repository.GetPriceHistorySummaryAsync();

    private static string RequireValue(string value, string parameterName)
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            throw new ArgumentException("Value is required.", parameterName);
        }

        return value.Trim();
    }

    private static int NormalizeLimit(int limit, int min, int max)
        => Math.Clamp(limit, min, max);
}
