import mysql from 'mysql2/promise';

/* ─── Tipos ─────────────────────────────────────────────────────────────── */
export interface TicketRow {
  id_ticket: number;
  titulo: string;
  ticket_cliente: string;
  id_estado: number;
  id_tipo: number;
  fecha_solicitud: string;
  descripcion: string;
}

export interface RespuestaRow {
  id_respuesta: number;
  id_ticket: number;
  descripcion: string;
  fecha: string;
}

/* ─── Mapeos ─────────────────────────────────────────────────────────────── */
const ESTADO_MAP: Record<number, string> = {
  1: 'Nuevo 🆕',
  2: 'En revisión 🔍',
  3: 'Por agendar 📅',
  4: 'Agendado 📆',
  5: 'Esperando cliente ⏳',
  6: 'Respondido por cliente ✉️',
  7: 'En proceso 🔧',
  8: 'Listo para notificar ✅',
  9: 'En pruebas 🧪',
  10: 'Listo para producción 🚀',
};

const TIPO_MAP: Record<number, string> = {
  1: 'Soporte',
  2: 'Desarrollo',
  3: 'Instalación',
  4: 'Interno',
  5: 'FAQ',
};

export function estadoLabel(id: number): string {
  return ESTADO_MAP[id] ?? `Estado ${id}`;
}

export function tipoLabel(id: number): string {
  return TIPO_MAP[id] ?? 'Soporte';
}

/* ─── Conexión ───────────────────────────────────────────────────────────── */
let pool: mysql.Pool | null = null;

function getPool(): mysql.Pool {
  if (!pool) {
    const host = process.env.MYSQL_SOPORTE_HOST || 'localhost';
    const user = process.env.MYSQL_SOPORTE_USER || 'administrador_soporteUSR';
    const password = process.env.MYSQL_SOPORTE_PASS || '';
    const database = process.env.MYSQL_SOPORTE_DB || 'administrador_soporte';

    pool = mysql.createPool({
      host,
      user,
      password,
      database,
      charset: 'utf8mb4',
      waitForConnections: true,
      connectionLimit: 5,
      connectTimeout: 8000,
    });
  }
  return pool;
}

/* ─── Extraer número limpio del JID ─────────────────────────────────────── */
function phoneFromJid(jid: string): string {
  // "56912345678@s.whatsapp.net" → "56912345678"
  return jid.split('@')[0].split(':')[0];
}

/* ─── Crear ticket ───────────────────────────────────────────────────────── */
export async function createTicket(
  jid: string,
  name: string,
  description: string,
): Promise<number> {
  const db = getPool();
  const phone = phoneFromJid(jid);
  const titulo = description.length > 80
    ? description.slice(0, 77) + '...'
    : description;

  // Insertar en la tabla DEMO_TO_v2_ticket según la estructura de producción
  const [result] = await db.execute<mysql.ResultSetHeader>(
    `INSERT INTO DEMO_TO_v2_ticket
       (legacy_source, id_estado, id_prioridad, id_tipo,
        cliente_id_ref, contacto_id_ref, operador_owner_id_ref,
        titulo, descripcion, fecha_solicitud,
        precio, monto_a_pagar, created_by_ref, updated_by_ref)
     VALUES ('whatsapp', 1, 1, 1, 1, 0, 0, ?, ?, NOW(), 0.00, 0.00, 0, 0)`,
    [titulo, description],
  );

  const ticketId = result.insertId;

  // URLs del visor y de administración (igual que api_tickets.php)
  const viewerUrl = `https://chatbot.reservame.cl/widget_distribuible/chat_viewer.php?id=${ticketId}`;
  const adminUrl  = `https://qa.admin.reservame.cl/admin.php?m=ticket-etiquetas-v2&idTicket=${ticketId}`;
  
  const linkTexto = `🔗 VER CONVERSACIÓN: ${viewerUrl}\n🛠️ GESTIONAR TICKET (V2): ${adminUrl}\n\n`;

  // Guardar número de WhatsApp en la descripción e insertar links de visor
  await db.execute(
    `UPDATE DEMO_TO_v2_ticket
     SET descripcion = CONCAT(?, IFNULL(descripcion,''), '\n\n📱 WhatsApp: ', ?)
     WHERE id_ticket = ?`,
    [linkTexto, phone, ticketId],
  );

  return ticketId;
}

/* ─── Obtener ticket por ID ──────────────────────────────────────────────── */
export async function getTicketById(
  ticketId: number,
): Promise<{ ticket: TicketRow; respuestas: RespuestaRow[] } | null> {
  const db = getPool();

  const [rows] = await db.execute<mysql.RowDataPacket[]>(
    `SELECT id_ticket, titulo, CAST(cliente_id_ref AS CHAR) AS ticket_cliente, id_estado, id_tipo,
            fecha_solicitud, descripcion
     FROM DEMO_TO_v2_ticket
     WHERE id_ticket = ?
     LIMIT 1`,
    [ticketId],
  );

  if (!rows.length) return null;
  const ticket = rows[0] as TicketRow;

  // Consultar comentarios desde DEMO_TO_v2_ticket_comentario en lugar de DEMO_TO_v2_respuesta
  const [respRows] = await db.execute<mysql.RowDataPacket[]>(
    `SELECT 1 AS id_respuesta, id_ticket, cuerpo AS descripcion,
            DATE_FORMAT(created_at, '%d/%m/%Y %H:%i') as fecha
     FROM DEMO_TO_v2_ticket_comentario
     WHERE id_ticket = ?
     ORDER BY created_at ASC
     LIMIT 5`,
    [ticketId],
  );

  return { ticket, respuestas: respRows as RespuestaRow[] };
}

/* ─── Listar últimos tickets de un número ────────────────────────────────── */
export async function getTicketsByPhone(
  jid: string,
  limit = 5,
): Promise<TicketRow[]> {
  const db = getPool();
  const phone = phoneFromJid(jid);

  const [rows] = await db.execute<mysql.RowDataPacket[]>(
    `SELECT id_ticket, titulo, CAST(cliente_id_ref AS CHAR) AS ticket_cliente, id_estado, id_tipo,
            fecha_solicitud, descripcion
     FROM DEMO_TO_v2_ticket
     WHERE descripcion LIKE ?
     ORDER BY fecha_solicitud DESC
     LIMIT ?`,
    [`%📱 WhatsApp: ${phone}%`, limit],
  );

  return rows as TicketRow[];
}

/* ─── Cerrar pool (para tests) ───────────────────────────────────────────── */
export async function closePool(): Promise<void> {
  if (pool) {
    await pool.end();
    pool = null;
  }
}
