using System;
using Enyim.Caching;
using Expedience.Infrastructure.Models;
using Microsoft.EntityFrameworkCore;

namespace Expedience.Infrastructure;

public interface IExpedienceRepository
{
	ValueTask<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken);
    ValueTask<List<DeepDungeonRecord>> GetDeepDungeonRecords(CancellationToken cancellationToken);
}

public class ExpedienceRepository : IExpedienceRepository
{
    private readonly ExpedienceContext _dbContext;
    private readonly IMemcachedClient _memcachedClient;

    public ExpedienceRepository(ExpedienceContext dbContext, IMemcachedClient memcachedClient)
    {
        _dbContext = dbContext;
        _memcachedClient = memcachedClient;
    }

    public async ValueTask<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken)
    {
        var cacheKey = $"xpd-dcr-{expac}";
        var cacheSeconds = 600;
        var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds,
            async () => await _dbContext.DutyCompletionRecords.FromSqlInterpolated($"SELECT * FROM public.get_dutycompletionrecords({expac})")
                .ToListAsync(cancellationToken));

        return records;
    }

    public async ValueTask<List<DeepDungeonRecord>> GetDeepDungeonRecords(CancellationToken cancellationToken)
    {
        var cacheKey = $"xpd-dd";
        var cacheSeconds = 600;
        var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds,
            async () => await _dbContext.DeepDungeonRecords.FromSqlInterpolated($"SELECT * FROM public.get_deepdungeonresults()")
                .ToListAsync(cancellationToken));

        return records;
    }
}
