/**
 * Common Domain - Validation Utilities
 * 
 * Generic validation functions used across all domains.
 * These are pure functions with no infrastructure dependencies.
 */

import { z } from "zod";

/**
 * UUID validation schema (v4)
 */
export const uuidSchema = z.string().uuid();

/**
 * Required non-empty string schema (trimmed)
 * Use for any string that must have a value
 */
export const requiredStringSchema = z.string().min(1, "This field is required").trim();

/**
 * Customer number / account number schema
 * Generic schema for customer/account identifiers
 */
export const customerNumberSchema = z.string().min(1, "Customer number is required").trim();

/**
 * Normalize and validate an email address
 * 
 * This is a convenience wrapper that throws on invalid input.
 * For validation without throwing, use the emailSchema directly with .safeParse()
 * 
 * @throws Error if email format is invalid
 */
export function normalizeAndValidateEmail(email: string): string {
  const emailValidationSchema = z.string().email().transform(e => e.toLowerCase().trim());
  return emailValidationSchema.parse(email);
}

/**
 * Validate a UUID (v4)
 * 
 * This is a convenience wrapper that throws on invalid input.
 * For validation without throwing, use the uuidSchema directly with .safeParse()
 * 
 * @throws Error if UUID format is invalid
 */
export function validateUuidV4OrThrow(id: string): string {
  try {
    return uuidSchema.parse(id);
  } catch {
    throw new Error("Invalid user ID format");
  }
}

/**
 * Check if a string is a valid email (non-throwing)
 */
export function isValidEmail(email: string): boolean {
  return z.string().email().safeParse(email).success;
}

/**
 * Check if a string is a valid UUID (non-throwing)
 */
export function isValidUuid(id: string): boolean {
  return uuidSchema.safeParse(id).success;
}

/**
 * URL validation schema
 */
export const urlSchema = z.string().url();

/**
 * Validate a URL
 * 
 * This is a convenience wrapper that throws on invalid input.
 * For validation without throwing, use the urlSchema directly with .safeParse()
 * 
 * @throws Error if URL format is invalid
 */
export function validateUrlOrThrow(url: string): string {
  try {
    return urlSchema.parse(url);
  } catch {
    throw new Error("Invalid URL format");
  }
}

/**
 * Validate a URL (non-throwing)
 * 
 * Returns validation result with errors if any.
 * Prefer using urlSchema.safeParse() directly for more control.
 */
export function validateUrl(url: string): { isValid: boolean; errors: string[] } {
  const result = urlSchema.safeParse(url);
  return {
    isValid: result.success,
    errors: result.success ? [] : result.error.issues.map(i => i.message),
  };
}

/**
 * Check if a string is a valid URL (non-throwing)
 */
export function isValidUrl(url: string): boolean {
  return urlSchema.safeParse(url).success;
}
