using System.Text;
using Org.BouncyCastle.Tls;
using Org.BouncyCastle.Tls.Crypto;
using Org.BouncyCastle.Tls.Crypto.Impl.BC;

namespace Prospect.Unreal.Net.Dtls;

/// <summary>
/// Serveur DTLS en mode PSK (BouncyCastle) pour The Cycle. L'identité PSK
/// annoncée par le client est son user_id ; on récupère la clé correspondante
/// dans le <see cref="DtlsPskStore"/>. Le client embarque des suites PSK-AES256
/// (ECDHE/DHE) sur DTLS 1.2.
/// </summary>
public sealed class ProspectPskTlsServer : PskTlsServer
{
    public ProspectPskTlsServer(DtlsPskStore store)
        : base(new BcTlsCrypto(), new ProspectPskIdentityManager(store))
    {
    }

    // Le client négocie en DTLS ; on restreint aux versions DTLS.
    protected override ProtocolVersion[] GetSupportedVersions()
    {
        return new[] { ProtocolVersion.DTLSv12, ProtocolVersion.DTLSv10 };
    }

    private sealed class ProspectPskIdentityManager : TlsPskIdentityManager
    {
        private readonly DtlsPskStore _store;

        public ProspectPskIdentityManager(DtlsPskStore store)
        {
            _store = store;
        }

        // Pas de hint côté serveur (le client connaît déjà son identité).
        public byte[]? GetHint() => null;

        public byte[]? GetPsk(byte[] identity)
        {
            var id = Encoding.UTF8.GetString(identity);
            return _store.Get(id);
        }
    }
}
