using System.Security.Cryptography;
using System.Text;

namespace API;

public static class TokenGen
{
    private const int MinimumLength = 32;
    private const int MaximumLength = 64;
    private const string Chars = "abcdefghijklmnopqrstuvwxyz0123456789";

    public static string CreateToken(Type t, params string[] identifiers) => CreateToken(t.Name, identifiers);
    
    public static string CreateToken(string prefix, params string[] identifiers)
    {
        
        
        if (prefix.Length + 1 >= MaximumLength - MinimumLength)
            throw new ArgumentException("Prefix to long to create Token of meaningful length.");
        
        int tokenLength = MaximumLength - prefix.Length - 1;
        
        if (identifiers.Length == 0)
        {
            // No identifier, just create a random token
            byte[] rng = new byte[tokenLength];
            RandomNumberGenerator.Create().GetBytes(rng);
            string key = new(rng.Select(b => Chars[b % Chars.Length]).ToArray());
            key = string.Join('-', prefix, key);
            return key;
        }

        // Identifier provided, create a token based on the identifier hashed
        byte[] hash = MD5.HashData(Encoding.UTF8.GetBytes(string.Join("", identifiers)));
        string token = Convert.ToHexStringLower(hash);
        
        return string.Join('-', prefix, token);
    }
}