using Dapper;
using Npgsql;

namespace Kbx.Shared.Runtime;

public sealed class KbxOperationRunRepository(NpgsqlDataSource dataSource)
{
    public async Task<IReadOnlyList<KbxOperationRunDto>> GetRecentAsync(Guid tenantId, Guid userId, int limit, CancellationToken ct)
    {
        const string sql = """
        select id, operation_type as Type, title, source_screen_id as SourceScreenId,
               status, requested_at as RequestedAt, started_at as StartedAt,
               completed_at as CompletedAt, processed, total, succeeded, failed,
               correlation_id as CorrelationId, result_message as ResultMessage
        from kbx.operation_runs
        where tenant_id=@tenantId and user_id=@userId
        order by requested_at desc
        limit @limit;
        """;
        await using var connection = await dataSource.OpenConnectionAsync(ct);
        var rows = await connection.QueryAsync<KbxOperationRunDto>(new CommandDefinition(sql, new { tenantId, userId, limit = Math.Clamp(limit, 1, 50) }, cancellationToken: ct));
        return rows.AsList();
    }
}
