/**
 * WhatsApp Transport Templates
 * ERP Transportistas
 *
 * Template definitions for transport-specific WhatsApp notifications.
 * Sprint: S5 - TASK-007
 * Module: WhatsApp Integration
 */

/**
 * Template categories for Meta Business API
 */
export enum CategoriaTemplate {
  UTILITY = 'UTILITY',
  MARKETING = 'MARKETING',
  AUTHENTICATION = 'AUTHENTICATION',
}

/**
 * Template language codes
 */
export enum IdiomaTemplate {
  ES_MX = 'es_MX',
  ES = 'es',
  EN = 'en',
}

/**
 * Transport template types
 */
export enum TipoTemplateTransporte {
  VIAJE_ASIGNADO = 'viaje_asignado',
  VIAJE_CONFIRMADO = 'viaje_confirmado',
  ETA_ACTUALIZADO = 'eta_actualizado',
  VIAJE_COMPLETADO = 'viaje_completado',
  ALERTA_RETRASO = 'alerta_retraso',
  ASIGNACION_CARRIER = 'asignacion_carrier',
  RECORDATORIO_MANTENIMIENTO = 'recordatorio_mantenimiento',
  POD_DISPONIBLE = 'pod_disponible',
  FACTURA_LISTA = 'factura_lista',
}

/**
 * Template definition interface
 */
export interface WhatsAppTemplate {
  nombre: string;
  tipo: TipoTemplateTransporte;
  categoria: CategoriaTemplate;
  idioma: IdiomaTemplate;
  componentes: {
    header?: {
      tipo: 'TEXT' | 'IMAGE' | 'DOCUMENT' | 'VIDEO';
      texto?: string;
      parametros?: string[];
    };
    body: {
      texto: string;
      parametros: string[];
    };
    footer?: {
      texto: string;
    };
    buttons?: Array<{
      tipo: 'QUICK_REPLY' | 'URL' | 'PHONE_NUMBER';
      texto: string;
      url?: string;
      telefono?: string;
    }>;
  };
}

/**
 * Transport WhatsApp Templates for Mexico
 */
export const TRANSPORT_TEMPLATES: Record<TipoTemplateTransporte, WhatsAppTemplate> = {
  [TipoTemplateTransporte.VIAJE_ASIGNADO]: {
    nombre: 'viaje_asignado_v1',
    tipo: TipoTemplateTransporte.VIAJE_ASIGNADO,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '🚚 Nuevo Viaje Asignado',
      },
      body: {
        texto: `Hola {{1}},

Se te ha asignado un nuevo viaje:

📍 Origen: {{2}}
📍 Destino: {{3}}
📅 Fecha: {{4}}
⏰ Hora cita: {{5}}
🔢 Folio: {{6}}

Por favor confirma tu disponibilidad.`,
        parametros: ['nombre_operador', 'origen', 'destino', 'fecha', 'hora_cita', 'folio_viaje'],
      },
      footer: {
        texto: 'Transportes - Sistema de Despacho',
      },
      buttons: [
        { tipo: 'QUICK_REPLY', texto: '✅ Confirmar' },
        { tipo: 'QUICK_REPLY', texto: '❌ No disponible' },
      ],
    },
  },

  [TipoTemplateTransporte.VIAJE_CONFIRMADO]: {
    nombre: 'viaje_confirmado_v1',
    tipo: TipoTemplateTransporte.VIAJE_CONFIRMADO,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '✅ Confirmación de Embarque',
      },
      body: {
        texto: `Estimado cliente {{1}},

Su embarque ha sido confirmado:

🔢 Folio: {{2}}
🚚 Unidad: {{3}}
👤 Operador: {{4}}
📅 Fecha estimada: {{5}}
⏰ ETA: {{6}}

Puede dar seguimiento en tiempo real con el código: {{7}}`,
        parametros: ['nombre_cliente', 'folio', 'unidad', 'operador', 'fecha', 'eta', 'codigo_tracking'],
      },
      footer: {
        texto: 'Gracias por su preferencia',
      },
      buttons: [
        { tipo: 'URL', texto: '📍 Rastrear Envío', url: 'https://track.example.com/{{1}}' },
      ],
    },
  },

  [TipoTemplateTransporte.ETA_ACTUALIZADO]: {
    nombre: 'eta_actualizado_v1',
    tipo: TipoTemplateTransporte.ETA_ACTUALIZADO,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      body: {
        texto: `📢 Actualización de ETA

Folio: {{1}}
Nueva hora estimada de llegada: {{2}}

Motivo: {{3}}

Disculpe las molestias.`,
        parametros: ['folio', 'nuevo_eta', 'motivo'],
      },
      footer: {
        texto: 'Sistema de Tracking',
      },
    },
  },

  [TipoTemplateTransporte.VIAJE_COMPLETADO]: {
    nombre: 'viaje_completado_v1',
    tipo: TipoTemplateTransporte.VIAJE_COMPLETADO,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '✅ Entrega Completada',
      },
      body: {
        texto: `Estimado cliente {{1}},

Su envío ha sido entregado exitosamente.

🔢 Folio: {{2}}
📍 Destino: {{3}}
📅 Fecha/Hora: {{4}}
👤 Recibió: {{5}}

El comprobante de entrega (POD) está disponible.`,
        parametros: ['nombre_cliente', 'folio', 'destino', 'fecha_hora', 'receptor'],
      },
      footer: {
        texto: 'Gracias por su preferencia',
      },
      buttons: [
        { tipo: 'URL', texto: '📄 Ver POD', url: 'https://pod.example.com/{{1}}' },
      ],
    },
  },

  [TipoTemplateTransporte.ALERTA_RETRASO]: {
    nombre: 'alerta_retraso_v1',
    tipo: TipoTemplateTransporte.ALERTA_RETRASO,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '⚠️ Alerta de Retraso',
      },
      body: {
        texto: `Estimado {{1}},

Le informamos que el viaje {{2}} presenta un retraso.

🕐 ETA original: {{3}}
🕐 Nuevo ETA: {{4}}
📝 Motivo: {{5}}

Nuestro equipo está trabajando para minimizar el impacto.`,
        parametros: ['nombre', 'folio', 'eta_original', 'nuevo_eta', 'motivo'],
      },
      footer: {
        texto: 'Lamentamos los inconvenientes',
      },
    },
  },

  [TipoTemplateTransporte.ASIGNACION_CARRIER]: {
    nombre: 'asignacion_carrier_v1',
    tipo: TipoTemplateTransporte.ASIGNACION_CARRIER,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '📋 Solicitud de Servicio',
      },
      body: {
        texto: `Estimado proveedor {{1}},

Tenemos un viaje disponible para su flota:

📍 Origen: {{2}}
📍 Destino: {{3}}
📅 Fecha: {{4}}
💰 Tarifa: {{5}} MXN

¿Le interesa tomarlo?`,
        parametros: ['nombre_carrier', 'origen', 'destino', 'fecha', 'tarifa'],
      },
      buttons: [
        { tipo: 'QUICK_REPLY', texto: '✅ Acepto' },
        { tipo: 'QUICK_REPLY', texto: '❌ Declino' },
        { tipo: 'QUICK_REPLY', texto: '💬 Negociar' },
      ],
    },
  },

  [TipoTemplateTransporte.RECORDATORIO_MANTENIMIENTO]: {
    nombre: 'recordatorio_mantenimiento_v1',
    tipo: TipoTemplateTransporte.RECORDATORIO_MANTENIMIENTO,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '🔧 Recordatorio de Mantenimiento',
      },
      body: {
        texto: `Unidad {{1}} requiere mantenimiento:

📋 Tipo: {{2}}
📅 Fecha límite: {{3}}
🔢 Km actual: {{4}}
🔢 Km programado: {{5}}

Por favor agende el servicio a la brevedad.`,
        parametros: ['unidad', 'tipo_mantenimiento', 'fecha_limite', 'km_actual', 'km_programado'],
      },
      footer: {
        texto: 'Sistema de Mantenimiento',
      },
    },
  },

  [TipoTemplateTransporte.POD_DISPONIBLE]: {
    nombre: 'pod_disponible_v1',
    tipo: TipoTemplateTransporte.POD_DISPONIBLE,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      body: {
        texto: `📄 POD Disponible

Folio: {{1}}
El comprobante de entrega ya está disponible para descarga.

Acceda con su código: {{2}}`,
        parametros: ['folio', 'codigo_acceso'],
      },
      buttons: [
        { tipo: 'URL', texto: '📥 Descargar POD', url: 'https://pod.example.com/{{1}}' },
      ],
    },
  },

  [TipoTemplateTransporte.FACTURA_LISTA]: {
    nombre: 'factura_lista_v1',
    tipo: TipoTemplateTransporte.FACTURA_LISTA,
    categoria: CategoriaTemplate.UTILITY,
    idioma: IdiomaTemplate.ES_MX,
    componentes: {
      header: {
        tipo: 'TEXT',
        texto: '📋 Factura Disponible',
      },
      body: {
        texto: `Estimado cliente {{1}},

Su factura está lista:

🔢 Folio: {{2}}
💰 Total: \${{3}} MXN
📅 Fecha: {{4}}
📋 UUID: {{5}}

Puede descargar el PDF y XML desde el portal.`,
        parametros: ['nombre_cliente', 'folio_factura', 'total', 'fecha', 'uuid'],
      },
      buttons: [
        { tipo: 'URL', texto: '📥 Descargar Factura', url: 'https://facturas.example.com/{{1}}' },
      ],
    },
  },
};

/**
 * Get template by type
 */
export function getTemplate(tipo: TipoTemplateTransporte): WhatsAppTemplate | undefined {
  return TRANSPORT_TEMPLATES[tipo];
}

/**
 * Get all templates
 */
export function getAllTemplates(): WhatsAppTemplate[] {
  return Object.values(TRANSPORT_TEMPLATES);
}

/**
 * Build message payload from template
 */
export function buildMessagePayload(
  template: WhatsAppTemplate,
  parametros: Record<string, string>
): {
  template: string;
  language: string;
  components: any[];
} {
  const components: any[] = [];

  // Header parameters
  if (template.componentes.header?.parametros) {
    components.push({
      type: 'header',
      parameters: template.componentes.header.parametros.map(p => ({
        type: 'text',
        text: parametros[p] || '',
      })),
    });
  }

  // Body parameters
  if (template.componentes.body.parametros.length > 0) {
    components.push({
      type: 'body',
      parameters: template.componentes.body.parametros.map(p => ({
        type: 'text',
        text: parametros[p] || '',
      })),
    });
  }

  // Button parameters (for URL buttons with dynamic values)
  if (template.componentes.buttons) {
    const urlButtons = template.componentes.buttons.filter(b => b.tipo === 'URL' && b.url?.includes('{{'));
    if (urlButtons.length > 0) {
      components.push({
        type: 'button',
        sub_type: 'url',
        index: 0,
        parameters: [{ type: 'text', text: parametros['url_param'] || parametros['folio'] || '' }],
      });
    }
  }

  return {
    template: template.nombre,
    language: template.idioma,
    components,
  };
}
