using System.Security.Cryptography;
using System.Text;
using MSEssentials.Extensions;
using WatchIt.DTO.Models.Controllers.Accounts;

namespace WatchIt.WebAPI.Helpers;

public static class PasswordHelpers
{
    #region CONSTANTS

    private const string RandomPasswordCharacters = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890!@#$%^&*()-_=+[{]};:'\"\\|,<.>/?";

    #endregion
    
    
    
    #region PUBLIC METHODS

    public static PasswordData GeneratePasswordData(string password)
    {
        string leftSalt = StringExtensions.CreateRandom(20, RandomPasswordCharacters);
        string rightSalt = StringExtensions.CreateRandom(20, RandomPasswordCharacters);
        byte[] hash = ComputeHash(password, leftSalt, rightSalt);
        return new PasswordData
        {
            LeftSalt = leftSalt,
            RightSalt = rightSalt,
            PasswordHash = hash,
        };
    }

    public static byte[] ComputeHash(string password, string leftSalt, string rightSalt)
    {
        string stringToHash = $"{leftSalt}{password}{rightSalt}";
        byte[] encodedString = Encoding.UTF8.GetBytes(stringToHash);
        byte[] hash = SHA512.HashData(encodedString);
        return hash;
    }

    public static bool ValidatePassword(string password, PasswordData passwordData)
    {
        byte[] checkedHash = ComputeHash(password, passwordData.LeftSalt, passwordData.RightSalt);
        byte[] actualHash = passwordData.PasswordHash;
        bool result = checkedHash.SequenceEqual(actualHash);
        return result;
    }
    
    #endregion
}