using System.Collections.Immutable;
using Microsoft.AspNetCore.Identity;
using Phantom.Server.Database.Entities;

namespace Phantom.Server.Services.Users;

internal static class UserPasswords {
	private static PasswordHasher<UserEntity> Hasher { get; } = new ();

	private const int MinimumLength = 16;
	
	public static ImmutableArray<PasswordRequirementViolation> CheckRequirements(string password) {
		var violations = ImmutableArray.CreateBuilder<PasswordRequirementViolation>();
		
		if (password.Length < MinimumLength) {
			violations.Add(new PasswordRequirementViolation.TooShort(MinimumLength));
		}

		if (!password.Any(char.IsLower)) {
			violations.Add(new PasswordRequirementViolation.LowercaseLetterRequired());
		}

		if (!password.Any(char.IsUpper)) {
			violations.Add(new PasswordRequirementViolation.UppercaseLetterRequired());
		}

		if (!password.Any(char.IsDigit)) {
			violations.Add(new PasswordRequirementViolation.DigitRequired());
		}
		
		return violations.ToImmutable();
	}

	public static void Set(UserEntity user, string password) {
		user.PasswordHash = Hasher.HashPassword(user, password);
	}
	
	public static PasswordVerificationResult Verify(UserEntity user, string password) {
		return Hasher.VerifyHashedPassword(user, user.PasswordHash, password);
	}
}