using Microsoft.AspNetCore.DataProtection.Repositories;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Ablera.Serdica.Authentication.Utilities;

// Move this to ...Authentication.Redis or something
public sealed class RedisAndFileSystemXmlRepository : IXmlRepository
{
    private readonly IDatabase _db;
    private readonly string _prefix;

    public RedisAndFileSystemXmlRepository(IDatabase db, string prefix)
    {
        _db = db;
        _prefix = prefix;
    }

    public IReadOnlyCollection<XElement> GetAllElements()
    {
        var keys = _db.SetMembers(_prefix);
        var list = new List<XElement>();

        foreach (var redisValue in keys)
        {
            var xml = redisValue.ToString();
            try { list.Add(XElement.Parse(xml)); }
            catch { /* ignore corrupted entry */ }
        }
        return list;
    }

    public void StoreElement(XElement element, string friendlyName)
    {
        var xml = element.ToString(SaveOptions.DisableFormatting);

        /* 1) write to Redis (set-add = idempotent) */
        _db.SetAdd(_prefix, xml);
    }
}

