import { randomInt } from 'node:crypto';
import argon2 from 'argon2';

const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%_-';

export function generateTemporaryPassword(length = 22): string {
  if (length < 16) throw new Error('طول رمز موقت باید حداقل ۱۶ کاراکتر باشد.');
  const pick = (source: string) => source[randomInt(source.length)]!;
  const required = [pick('ABCDEFGHJKLMNPQRSTUVWXYZ'), pick('abcdefghijkmnopqrstuvwxyz'), pick('23456789'), pick('!@#$%_-')];
  while (required.length < length) required.push(pick(chars));
  for (let i = required.length - 1; i > 0; i -= 1) {
    const j = randomInt(i + 1);
    [required[i], required[j]] = [required[j]!, required[i]!];
  }
  return required.join('');
}

export async function hashPassword(password: string): Promise<string> {
  return argon2.hash(password, {
    type: argon2.argon2id,
    memoryCost: 65_536,
    timeCost: 3,
    parallelism: 2
  });
}

export async function verifyPassword(hash: string, password: string): Promise<boolean> {
  try {
    return await argon2.verify(hash, password);
  } catch {
    return false;
  }
}

export function validatePasswordStrength(password: string): string[] {
  const errors: string[] = [];
  if (password.length < 12) errors.push('رمز عبور باید حداقل ۱۲ کاراکتر باشد.');
  if (!/[A-Z]/.test(password)) errors.push('رمز عبور باید حداقل یک حرف بزرگ لاتین داشته باشد.');
  if (!/[a-z]/.test(password)) errors.push('رمز عبور باید حداقل یک حرف کوچک لاتین داشته باشد.');
  if (!/\d/.test(password)) errors.push('رمز عبور باید حداقل یک رقم داشته باشد.');
  if (!/[^A-Za-z0-9]/.test(password)) errors.push('رمز عبور باید حداقل یک نشانه ویژه داشته باشد.');
  return errors;
}

