/**
 * Tipos y interfaces para el Dashboard de Llamadas
 * Contiene todas las definiciones de tipos utilizadas en el sistema de monitoreo
 */

/**
 * Estados técnicos de las extensiones según Asterisk
 */
export type ExtensionStatus =
  | "Registered"
  | "Unregistered"
  | "Reachable"
  | "Unreachable"
  | "Lagged"
  | "Unknown"
  | "InUse"
  | "NotInUse"
  | "Ringing"
  | "Busy"
  | "Hold"
  | "Unavailable";

/**
 * Estados amigables para mostrar al usuario
 */
export type FriendlyStatus =
  | "Disponible"
  | "Timbrando"
  | "Sonando"
  | "En llamada"
  | "Ocupado"
  | "En espera"
  | "No registrado"
  | "Desconectado"
  | "No disponible"
  | "Desconocido";

/**
 * Evento AMI genérico recibido desde Asterisk
 * NOTA: AmiEvent ahora se importa desde @/types/ami-events
 */

/**
 * Estado completo de una extensión/endpoint
 */
export type ExtensionState = {
  /** ID del peer (ej: "101") */
  peer: string;
  /** Estado actual de la extensión */
  status: ExtensionStatus;
  /** Detalles adicionales del estado */
  details: string;
  /** ID del llamante */
  callerId?: string;
  /** Nombre del llamante */
  callerIdName?: string;
  /** Línea conectada */
  connectedLine?: string;
  /** Canal activo */
  channel?: string;
  /** Información PJSIP del endpoint */
  aors?: string;
  /** Contactos PJSIP */
  contacts?: string;
  /** Transporte utilizado */
  transport?: string;
  /** Timestamp cuando comenzó a timbrar */
  ringStartedAt?: number;
  /** Timestamp cuando comenzó la llamada */
  callStartedAt?: number;
};

/**
 * Información de contacto conectado con propiedades adicionales
 */
export type ConnectedContact = { 
  device: string; 
  ip: string; 
  userAgent?: string;
  contact?: string;
  rtt?: number;
};

/**
 * Apariencia visual de un estado (icono, color, etiqueta)
 */
export type StatusAppearance = {
  icon: React.ComponentType<{ className?: string }>;
  color: string;
  className: string;
  label: FriendlyStatus;
};

/**
 * Información de latencia y IPs extraída de contactos
 */
export type ContactsInfo = {
  ips: string[];
  latencyMs?: number;
};

/**
 * Datos de latencia de un endpoint
 */
export type EndpointLatencyData = {
  latencyMs?: number;
  status: string;
};

/**
 * Mapa de latencias por endpoint
 */
export type EndpointsLatencyMap = Record<string, EndpointLatencyData>;

/**
 * Mapeo de estados amigables a estados técnicos
 */
export type FriendlyToTechStatusMap = Record<FriendlyStatus, ExtensionStatus[]>;