import {
  createTicket,
  getTicketById,
  getTicketsByPhone,
  estadoLabel,
  tipoLabel,
} from './tickets';

/* ─── Estado de sesión por usuario (para flujos multi-paso) ─────────────── */
interface PendingAction {
  type: 'creating_ticket';
  step: 'awaiting_description';
}

const pendingActions = new Map<string, PendingAction>();

/* ─── Ayuda ──────────────────────────────────────────────────────────────── */
const HELP_TEXT = `📋 *Comandos disponibles:*

• */ticket* _[descripción]_ — Crea un ticket de soporte
  _Ejemplo:_ /ticket No puedo acceder al sistema

• */estado* _[#número]_ — Consulta el estado de un ticket
  _Ejemplo:_ /estado 1024

• */mistickets* — Lista tus últimos 5 tickets

• */cancelar* — Cancela la operación actual

• */ayuda* — Muestra este menú

━━━━━━━━━━━━━━━━━━━━━━
_Todos los comandos empiezan con_ /`;

/* ─── Formateadores ──────────────────────────────────────────────────────── */
function formatTicket(
  ticket: Awaited<ReturnType<typeof getTicketById>>,
): string {
  if (!ticket) return '❌ Ticket no encontrado.';
  const { ticket: t, respuestas } = ticket;

  const fecha = t.fecha_solicitud
    ? new Date(t.fecha_solicitud).toLocaleDateString('es-CL', {
        day: '2-digit',
        month: '2-digit',
        year: 'numeric',
      })
    : '—';

  let msg =
    `🎫 *Ticket #${t.id_ticket}*\n` +
    `📌 *Estado:* ${estadoLabel(t.id_estado)}\n` +
    `🏷️ *Tipo:* ${tipoLabel(t.id_tipo)}\n` +
    `📅 *Fecha:* ${fecha}\n` +
    `📝 *Asunto:* ${t.titulo}\n`;

  if (respuestas.length > 0) {
    msg += '\n💬 *Últimas actualizaciones:*\n';
    for (const r of respuestas.slice(-3)) {
      const desc = r.descripcion
        .replace(/<[^>]*>/g, '') // quitar HTML
        .trim()
        .slice(0, 120);
      msg += `  • [${r.fecha}] ${desc}\n`;
    }
  } else {
    msg += '\n_Sin actualizaciones aún._\n';
  }

  return msg.trim();
}

function formatTicketList(tickets: Awaited<ReturnType<typeof getTicketsByPhone>>): string {
  if (!tickets.length) {
    return '📭 No encontré tickets asociados a tu número de WhatsApp.\n\nPuedes crear uno con: */ticket [descripción]*';
  }

  let msg = `📋 *Tus últimos ${tickets.length} ticket(s):*\n\n`;
  for (const t of tickets) {
    const fecha = t.fecha_solicitud
      ? new Date(t.fecha_solicitud).toLocaleDateString('es-CL', {
          day: '2-digit',
          month: '2-digit',
        })
      : '—';
    msg += `🎫 *#${t.id_ticket}* — ${estadoLabel(t.id_estado)}\n`;
    msg += `   📝 ${t.titulo.slice(0, 60)}\n`;
    msg += `   📅 ${fecha}\n\n`;
  }
  msg += '_Usa_ */estado [#número]* _para ver detalles._';
  return msg.trim();
}

/* ─── Motor de comandos ──────────────────────────────────────────────────── */
export type CommandResult =
  | { handled: true; reply: string }
  | { handled: false };

export async function handleCommand(
  jid: string,
  name: string,
  text: string,
): Promise<CommandResult> {
  const trimmed = text.trim();

  /* ── ¿Hay una acción pendiente? (flujo multi-paso) ── */
  const pending = pendingActions.get(jid);
  if (pending) {
    if (pending.type === 'creating_ticket') {
      // El usuario está respondiendo con la descripción del ticket
      if (trimmed.toLowerCase() === '/cancelar') {
        pendingActions.delete(jid);
        return { handled: true, reply: '❌ Creación de ticket cancelada.' };
      }

      pendingActions.delete(jid);
      try {
        const id = await createTicket(jid, name, trimmed);
        return {
          handled: true,
          reply:
            `✅ *Ticket #${id} creado exitosamente*\n\n` +
            `📝 *Asunto:* ${trimmed.slice(0, 80)}\n` +
            `📌 *Estado:* Nuevo 🆕\n\n` +
            `Puedes consultar el avance con: */estado ${id}*`,
        };
      } catch (err: any) {
        console.error('[tickets] Error creando ticket:', err?.message || err);
        return {
          handled: true,
          reply:
            '⚠️ Hubo un error al crear el ticket. Por favor intenta de nuevo más tarde o contacta a un agente.',
        };
      }
    }
  }

  /* ── ¿Empieza con /? → Es un comando ── */
  if (!trimmed.startsWith('/')) return { handled: false };

  const [rawCmd, ...argParts] = trimmed.split(/\s+/);
  const cmd = rawCmd.toLowerCase();
  const args = argParts.join(' ').trim();

  /* ── /ayuda ── */
  if (cmd === '/ayuda' || cmd === '/help' || cmd === '/menu') {
    return { handled: true, reply: HELP_TEXT };
  }

  /* ── /cancelar ── */
  if (cmd === '/cancelar' || cmd === '/cancel') {
    if (pendingActions.has(jid)) {
      pendingActions.delete(jid);
      return { handled: true, reply: '❌ Operación cancelada.' };
    }
    return { handled: true, reply: '✔️ No había ninguna operación en curso.' };
  }

  /* ── /ticket [descripcion] ── */
  if (cmd === '/ticket') {
    if (!args) {
      // Flujo multi-paso: pedir descripción
      pendingActions.set(jid, { type: 'creating_ticket', step: 'awaiting_description' });
      return {
        handled: true,
        reply:
          '📝 *Crear ticket de soporte*\n\n' +
          'Por favor, escribe una descripción detallada del problema o solicitud:\n\n' +
          '_Escribe_ */cancelar* _para cancelar._',
      };
    }

    // Descripción incluida directamente
    try {
      const id = await createTicket(jid, name, args);
      return {
        handled: true,
        reply:
          `✅ *Ticket #${id} creado exitosamente*\n\n` +
          `📝 *Asunto:* ${args.slice(0, 80)}\n` +
          `📌 *Estado:* Nuevo 🆕\n\n` +
          `Puedes consultar el avance con: */estado ${id}*`,
      };
    } catch (err: any) {
      console.error('[tickets] Error creando ticket:', err?.message || err);
      return {
        handled: true,
        reply:
          '⚠️ Hubo un error al crear el ticket. Por favor intenta de nuevo más tarde.',
      };
    }
  }

  /* ── /estado [#id] ── */
  if (cmd === '/estado' || cmd === '/status') {
    const rawId = args.replace('#', '').trim();
    const id = parseInt(rawId, 10);

    if (!rawId || isNaN(id) || id <= 0) {
      return {
        handled: true,
        reply:
          '⚠️ Debes indicar el número de ticket.\n_Ejemplo:_ */estado 1024*',
      };
    }

    try {
      const data = await getTicketById(id);
      if (!data) {
        return {
          handled: true,
          reply: `❌ No encontré el ticket *#${id}*.\n\nVerifica el número e intenta de nuevo.`,
        };
      }
      return { handled: true, reply: formatTicket(data) };
    } catch (err: any) {
      console.error('[tickets] Error consultando ticket:', err?.message || err);
      return {
        handled: true,
        reply: '⚠️ Error al consultar el ticket. Intenta de nuevo en un momento.',
      };
    }
  }

  /* ── /mistickets ── */
  if (cmd === '/mistickets' || cmd === '/tickets' || cmd === '/mis') {
    try {
      const list = await getTicketsByPhone(jid, 5);
      return { handled: true, reply: formatTicketList(list) };
    } catch (err: any) {
      console.error('[tickets] Error listando tickets:', err?.message || err);
      return {
        handled: true,
        reply: '⚠️ Error al consultar tus tickets. Intenta de nuevo en un momento.',
      };
    }
  }

  /* ── Comando desconocido que empieza con / ── */
  return {
    handled: true,
    reply:
      `❓ Comando *${cmd}* no reconocido.\n\nEscribe */ayuda* para ver los comandos disponibles.`,
  };
}
