/**
 * E-commerce Utility Functions
 */

// ============================================
// ID & Reference Generation
// ============================================

/**
 * Generate unique order number
 * Format: ORD-{timestamp36}-{random6}
 */
export function generateOrderNumber(): string {
  const timestamp = Date.now().toString(36).toUpperCase();
  const random = Math.random().toString(36).substring(2, 8).toUpperCase();
  return `ORD-${timestamp}-${random}`;
}

/**
 * Generate unique product slug
 */
export function generateSlug(text: string): string {
  return text
    .toLowerCase()
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .replace(/[^\w\s-]/g, '')
    .replace(/\s+/g, '-')
    .replace(/-+/g, '-')
    .trim();
}

/**
 * Generate unique ID (UUID v4 style)
 */
export function generateId(): string {
  return crypto.randomUUID();
}

/**
 * Generate short random string
 */
export function generateShortId(length = 8): string {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

// ============================================
// Currency & Number Formatting
// ============================================

/**
 * Format currency (THB default)
 */
export function formatCurrency(amount: number, currency = 'THB'): string {
  return new Intl.NumberFormat('th-TH', {
    style: 'currency',
    currency,
    minimumFractionDigits: 2,
    maximumFractionDigits: 2,
  }).format(amount);
}

/**
 * Format number with thousand separators
 */
export function formatNumber(num: number, decimals = 0): string {
  return new Intl.NumberFormat('th-TH', {
    minimumFractionDigits: decimals,
    maximumFractionDigits: decimals,
  }).format(num);
}

/**
 * Parse currency string to number
 */
export function parseCurrency(value: string): number {
  return parseFloat(value.replace(/[^\d.-]/g, ''));
}

// ============================================
// Date & Time Formatting
// ============================================

/**
 * Format date in Thai locale
 */
export function formatThaiDate(date: Date | string): string {
  const d = typeof date === 'string' ? new Date(date) : date;
  return new Intl.DateTimeFormat('th-TH', {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
  }).format(d);
}

/**
 * Format date and time in Thai locale
 */
export function formatThaiDateTime(date: Date | string): string {
  const d = typeof date === 'string' ? new Date(date) : date;
  return new Intl.DateTimeFormat('th-TH', {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    hour: '2-digit',
    minute: '2-digit',
  }).format(d);
}

/**
 * Format relative time (e.g., "2 ชั่วโมงที่แล้ว")
 */
export function formatRelativeTime(date: Date | string): string {
  const d = typeof date === 'string' ? new Date(date) : date;
  const now = new Date();
  const diff = now.getTime() - d.getTime();
  
  const seconds = Math.floor(diff / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);

  if (days > 0) return `${days} วันที่แล้ว`;
  if (hours > 0) return `${hours} ชั่วโมงที่แล้ว`;
  if (minutes > 0) return `${minutes} นาทีที่แล้ว`;
  return 'เมื่อสักครู่';
}

// ============================================
// Validation
// ============================================

/**
 * Validate email format
 */
export function isValidEmail(email: string): boolean {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

/**
 * Validate Thai phone number
 */
export function isValidThaiPhone(phone: string): boolean {
  // Accept formats: 0812345678, +66812345678, 08-123-4567
  const cleaned = phone.replace(/[\s-]/g, '');
  return /^(\+66|0)[6-9]\d{8}$/.test(cleaned);
}

/**
 * Validate Thai ID card number (13 digits)
 */
export function isValidThaiId(id: string): boolean {
  if (!/^\d{13}$/.test(id)) return false;
  
  let sum = 0;
  for (let i = 0; i < 12; i++) {
    sum += parseInt(id[i]) * (13 - i);
  }
  const checkDigit = (11 - (sum % 11)) % 10;
  return checkDigit === parseInt(id[12]);
}

/**
 * Validate password strength
 */
export function isValidPassword(password: string): {
  valid: boolean;
  errors: string[];
} {
  const errors: string[] = [];
  
  if (password.length < 8) {
    errors.push('รหัสผ่านต้องมีความยาวอย่างน้อย 8 ตัวอักษร');
  }
  if (!/[A-Z]/.test(password)) {
    errors.push('ต้องมีตัวพิมพ์ใหญ่อย่างน้อย 1 ตัว');
  }
  if (!/[a-z]/.test(password)) {
    errors.push('ต้องมีตัวพิมพ์เล็กอย่างน้อย 1 ตัว');
  }
  if (!/[0-9]/.test(password)) {
    errors.push('ต้องมีตัวเลขอย่างน้อย 1 ตัว');
  }
  
  return { valid: errors.length === 0, errors };
}

// ============================================
// Order Calculations
// ============================================

export interface CartItem {
  price: number;
  quantity: number;
}

export interface OrderTotals {
  subtotal: number;
  tax: number;
  shipping: number;
  discount: number;
  total: number;
}

/**
 * Calculate order totals
 */
export function calculateOrderTotals(
  items: CartItem[],
  options: {
    taxRate?: number;
    freeShippingThreshold?: number;
    shippingCost?: number;
    discount?: number;
  } = {}
): OrderTotals {
  const {
    taxRate = 0.07, // 7% VAT
    freeShippingThreshold = 500,
    shippingCost = 50,
    discount = 0,
  } = options;

  const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  const tax = subtotal * taxRate;
  const shipping = subtotal >= freeShippingThreshold ? 0 : shippingCost;
  const total = subtotal + tax + shipping - discount;

  return {
    subtotal: Math.round(subtotal * 100) / 100,
    tax: Math.round(tax * 100) / 100,
    shipping: Math.round(shipping * 100) / 100,
    discount: Math.round(discount * 100) / 100,
    total: Math.round(total * 100) / 100,
  };
}

/**
 * Calculate cart item count
 */
export function calculateCartCount(items: CartItem[]): number {
  return items.reduce((sum, item) => sum + item.quantity, 0);
}

/**
 * Calculate cart subtotal
 */
export function calculateCartSubtotal(items: CartItem[]): number {
  return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}

// ============================================
// Image & URL Helpers
// ============================================

/**
 * Get image URL with fallback
 */
export function getImageUrl(url: string | null | undefined, fallback = '/placeholder.png'): string {
  if (!url) return fallback;
  if (url.startsWith('http')) return url;
  return url;
}

/**
 * Generate product image URLs (multiple sizes)
 */
export function getProductImageUrls(baseUrl: string): {
  thumbnail: string;
  small: string;
  medium: string;
  large: string;
  original: string;
} {
  // If using Supabase Storage, append resize parameters
  if (baseUrl.includes('supabase')) {
    return {
      thumbnail: `${baseUrl}?width=150&height=150&resize=cover`,
      small: `${baseUrl}?width=300&height=300&resize=cover`,
      medium: `${baseUrl}?width=600&height=600&resize=cover`,
      large: `${baseUrl}?width=1200&height=1200&resize=cover`,
      original: baseUrl,
    };
  }
  
  // For other storage, return same URL
  return {
    thumbnail: baseUrl,
    small: baseUrl,
    medium: baseUrl,
    large: baseUrl,
    original: baseUrl,
  };
}

/**
 * Truncate text with ellipsis
 */
export function truncate(text: string, maxLength: number): string {
  if (text.length <= maxLength) return text;
  return text.slice(0, maxLength - 3) + '...';
}

// ============================================
// Thai Province Data
// ============================================

export const THAI_PROVINCES = [
  'กรุงเทพมหานคร',
  'กระบี่',
  'กาญจนบุรี',
  'กาฬสินธุ์',
  'กำแพงเพชร',
  'ขอนแก่น',
  'จันทบุรี',
  'ฉะเชิงเทรา',
  'ชลบุรี',
  'ชัยนาท',
  'ชัยภูมิ',
  'ชุมพร',
  'เชียงราย',
  'เชียงใหม่',
  'ตรัง',
  'ตราด',
  'ตาก',
  'นครนายก',
  'นครปฐม',
  'นครพนม',
  'นครราชสีมา',
  'นครศรีธรรมราช',
  'นครสวรรค์',
  'นนทบุรี',
  'นราธิวาส',
  'หนองคาย',
  'หนองบัวลำภู',
  'บึงกาฬ',
  'บุรีรัมย์',
  'ประจวบคีรีขันธ์',
  'ประจวบคีรีขันธ์',
  'ปราจีนบุรี',
  'ปัตตานี',
  'พะเยา',
  'พังงา',
  'พัทลุง',
  'พิจิตร',
  'พิษณุโลก',
  'เพชรบุรี',
  'เพชรบูรณ์',
  'แพร่',
  'พะเยา',
  'ภูเก็ต',
  'มหาสารคาม',
  'มุกดาหาร',
  'แม่ฮ่องสอน',
  'ยะลา',
  'ยโสธร',
  'ร้อยเอ็ด',
  'ระนอง',
  'ระยอง',
  'ราชบุรี',
  'ลพบุรี',
  'ลำปาง',
  'ลำพูน',
  'เลย',
  'ศรีสะเกษ',
  'สกลนคร',
  'สงขลา',
  'สตูล',
  'สมุทรปราการ',
  'สมุทรสงคราม',
  'สมุทรสาคร',
  'สระแก้ว',
  'สระบุรี',
  'สิงห์บุรี',
  'สุโขทัย',
  'สุพรรณบุรี',
  'สุราษฎร์ธานี',
  'สุรินทร์',
  'หนองคาย',
  'อ่างทอง',
  'อำนาจเจริญ',
  'อุดรธานี',
  'อุตรดิตถ์',
  'อุทัยธานี',
  'อุบลราชธานี',
] as const;

// ============================================
// Order Status Helpers
// ============================================

export const ORDER_STATUS = {
  pending: { label: 'รอดำเนินการ', color: 'yellow' },
  confirmed: { label: 'ยืนยันแล้ว', color: 'blue' },
  processing: { label: 'กำลังจัดเตรียม', color: 'blue' },
  shipped: { label: 'จัดส่งแล้ว', color: 'purple' },
  delivered: { label: 'ส่งมอบแล้ว', color: 'green' },
  cancelled: { label: 'ยกเลิก', color: 'red' },
} as const;

export const PAYMENT_STATUS = {
  pending: { label: 'รอชำระ', color: 'yellow' },
  paid: { label: 'ชำระแล้ว', color: 'green' },
  failed: { label: 'ล้มเหลว', color: 'red' },
  refunded: { label: 'คืนเงิน', color: 'gray' },
} as const;

export function getOrderStatusInfo(status: keyof typeof ORDER_STATUS) {
  return ORDER_STATUS[status] || { label: status, color: 'gray' };
}

export function getPaymentStatusInfo(status: keyof typeof PAYMENT_STATUS) {
  return PAYMENT_STATUS[status] || { label: status, color: 'gray' };
}
