import type { Locale } from '@/shared/types/common.types';
import type { TicketPriorityRef, TicketStatusRef, TicketSummary } from '@/features/tickets/types/ticket.types';
import type { BadgeProps } from '@/shared/components/ui';
import type { StatusTone } from '@/styles/theme';

export function localizedName(
  item: { name_en: string; name_ar: string },
  locale: Locale,
): string {
  return locale === 'ar' ? item.name_ar : item.name_en;
}

export function statusTone(status: TicketStatusRef): StatusTone {
  if (status.is_closed) {
    return 'closed';
  }

  const key = status.name_en.toLowerCase();
  if (key.includes('pending') || key.includes('hold') || key.includes('wait')) {
    return 'pending';
  }
  if (key.includes('progress') || key.includes('working') || key.includes('assigned')) {
    return 'inProgress';
  }
  if (key.includes('resolved') || key.includes('done')) {
    return 'resolved';
  }
  if (key.includes('new') || key.includes('open')) {
    return 'open';
  }
  if (key.includes('draft')) {
    return 'draft';
  }

  return 'active';
}

/** @deprecated Use statusTone + StatusBadge for new UI */
export function statusBadgeVariant(status: TicketStatusRef): BadgeProps['variant'] {
  const tone = statusTone(status);
  const map: Partial<Record<StatusTone, BadgeProps['variant']>> = {
    open: 'info',
    pending: 'warning',
    inProgress: 'secondary',
    resolved: 'success',
    closed: 'gray',
    draft: 'gray',
    active: 'info',
  };
  return map[tone] ?? 'gray';
}

export function priorityTone(priority: TicketPriorityRef): StatusTone {
  const key = priority.name_en.toLowerCase();
  if (key.includes('urgent') || key.includes('critical')) {
    return 'breached';
  }
  if (key.includes('high')) {
    return 'warning';
  }
  if (key.includes('low')) {
    return 'paused';
  }
  return 'neutral';
}

/** @deprecated Use priorityTone + StatusBadge for new UI */
export function priorityBadgeVariant(priority: TicketPriorityRef): BadgeProps['variant'] {
  const tone = priorityTone(priority);
  const map: Partial<Record<StatusTone, BadgeProps['variant']>> = {
    breached: 'error',
    warning: 'warning',
    paused: 'info',
    neutral: 'gray',
  };
  return map[tone] ?? 'gray';
}

export type SlaIndicator = {
  labelKey: 'active' | 'atRisk' | 'met' | 'closed' | 'unknown';
  tone: StatusTone;
  /** @deprecated */
  variant: BadgeProps['variant'];
};

/** Heuristic SLA indicator — backend does not expose sla_status on ticket resources yet. */
export function deriveSlaIndicator(ticket: TicketSummary): SlaIndicator {
  if (ticket.resolved_at || ticket.status.is_closed) {
    return { labelKey: 'met', tone: 'success', variant: 'success' };
  }

  if (!ticket.is_open) {
    return { labelKey: 'closed', tone: 'closed', variant: 'gray' };
  }

  if (ticket.age_in_days >= 5) {
    return { labelKey: 'atRisk', tone: 'warning', variant: 'warning' };
  }

  return { labelKey: 'active', tone: 'active', variant: 'info' };
}

export function formatDateTime(value: string, locale: Locale): string {
  try {
    return new Intl.DateTimeFormat(locale === 'ar' ? 'ar' : 'en', {
      dateStyle: 'medium',
      timeStyle: 'short',
    }).format(new Date(value));
  } catch {
    return value;
  }
}

/** Conversation message meta, e.g. "May 20, 2026, 6:11 PM" */
export function formatMessageTimestamp(value: string, locale: Locale): string {
  try {
    return new Intl.DateTimeFormat(locale === 'ar' ? 'ar-EG' : 'en-US', {
      month: 'long',
      day: 'numeric',
      year: 'numeric',
      hour: 'numeric',
      minute: '2-digit',
      hour12: true,
    }).format(new Date(value));
  } catch {
    return value;
  }
}
