// lib/validation.ts

// RFC-1035-ish hostname pattern: labels of alphanumerics/hyphens, dot separated, valid TLD length.
const DOMAIN_REGEX =
  /^(?=.{1,253}$)(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,63}$/;

// Local-part: letters, numbers, dots, hyphens, underscores. 1-64 chars per RFC 5321.
const PREFIX_REGEX = /^[a-zA-Z0-9._-]{1,64}$/;

export interface ValidationResult {
  valid: boolean;
  error?: string;
}

export function validateDomainName(name: string): ValidationResult {
  if (!name || typeof name !== "string") {
    return { valid: false, error: "Domain name is required" };
  }
  const trimmed = name.trim().toLowerCase();
  if (!DOMAIN_REGEX.test(trimmed)) {
    return { valid: false, error: "Invalid domain name format" };
  }
  return { valid: true };
}

export function validateEmailPrefix(prefix: string): ValidationResult {
  if (!prefix || typeof prefix !== "string") {
    return { valid: false, error: "Prefix is required" };
  }
  const trimmed = prefix.trim();
  if (!PREFIX_REGEX.test(trimmed)) {
    return {
      valid: false,
      error:
        "Prefix may only contain letters, numbers, dots, hyphens, and underscores (1-64 chars)",
    };
  }
  if (trimmed.startsWith(".") || trimmed.endsWith(".") || trimmed.includes("..")) {
    return { valid: false, error: "Prefix has invalid dot placement" };
  }
  return { valid: true };
}

export function validateUsername(username: string): ValidationResult {
  if (!username || typeof username !== "string") {
    return { valid: false, error: "Username is required" };
  }
  if (username.trim().length < 3 || username.trim().length > 32) {
    return { valid: false, error: "Username must be 3-32 characters" };
  }
  if (!/^[a-zA-Z0-9_.-]+$/.test(username.trim())) {
    return { valid: false, error: "Username contains invalid characters" };
  }
  return { valid: true };
}

/**
 * 10 days, in milliseconds — the single source of truth for TempEmail lifetime.
 */
export const TEMP_EMAIL_LIFETIME_MS = 10 * 24 * 60 * 60 * 1000;

export function computeExpiryDate(from: Date = new Date()): Date {
  return new Date(from.getTime() + TEMP_EMAIL_LIFETIME_MS);
}
