import { test, expect, handleElementDialogs } from "../fixtures/persistent-context";
import {
  goToRoom,
  sendMessage,
  waitForBotReply,
  assertNoDecryptionErrors,
  startThreadOnLastMessage,
  waitForThreadReplyViaSdk,
  closeThreadPanel,
} from "../fixtures/matrix-room";

test.describe("asistente-2", () => {
  test.beforeEach(async ({ page }) => {
    await page.goto("/");
    await handleElementDialogs(page);
    await goToRoom(page, "Asistente 2");
    // Cerrar thread panel si estaba abierto de sesiones previas.
    // Si queda abierto, sus sender elements contaminan los locators de waitForBotReply.
    await closeThreadPanel(page);
  });

  test("responde a un saludo", async ({ page }) => {
    await sendMessage(page, "Hola, que tal?");

    const reply = await waitForBotReply(page, {
      timeout: 60_000,
      sender: "Asistente 2",
    });
    expect(reply).toBeTruthy();
    expect(reply.length).toBeGreaterThan(10);
  });

  test("!tools muestra herramientas disponibles", async ({ page }) => {
    await sendMessage(page, "!tools");

    const reply = await waitForBotReply(page, {
      timeout: 10_000,
      sender: "Asistente 2",
    });
    expect(reply).toBeTruthy();
    // asistente-2 tiene al menos current_time
    expect(reply.toLowerCase()).toMatch(/current_time|hora|herramienta|tool/);
  });

  test("pregunta que activa tool use (que hora es?)", async ({ page }) => {
    await sendMessage(page, "Que hora es ahora mismo?");

    const reply = await waitForBotReply(page, {
      timeout: 60_000,
      sender: "Asistente 2",
    });
    expect(reply).toBeTruthy();
    // La respuesta debe contener algo relacionado con tiempo/hora
    expect(reply.length).toBeGreaterThan(5);
  });

  test("!help muestra comandos", async ({ page }) => {
    await sendMessage(page, "!help");

    const reply = await waitForBotReply(page, {
      timeout: 10_000,
      sender: "Asistente 2",
    });
    expect(reply).toBeTruthy();
    expect(reply.toLowerCase()).toContain("help");
    expect(reply.toLowerCase()).toContain("ping");
  });

  test("responde dentro del thread cuando se le habla por thread", async ({
    page,
  }) => {
    // Este test necesita mas tiempo: enviar msg + esperar bot + thread + esperar bot en thread
    test.setTimeout(120_000);
    // 1. Enviar un mensaje normal (sera el thread root)
    await sendMessage(page, "Mensaje para iniciar thread");

    // Esperar a que el bot responda al mensaje original
    await waitForBotReply(page, {
      timeout: 60_000,
      sender: "Asistente 2",
    });

    // 2. Enviar mensaje threaded via SDK (headless no soporta la hover action bar)
    await startThreadOnLastMessage(page);

    // 3. Esperar que el bot responda DENTRO del thread
    // Usar el SDK para verificar que hay una respuesta en el thread
    const threadReply = await waitForThreadReplyViaSdk(page, {
      timeout: 60_000,
      sender: "Asistente 2",
    });

    expect(threadReply).toBeTruthy();
    expect(threadReply.length).toBeGreaterThan(5);
  });

  test("no hay errores de E2EE en el timeline", async ({ page }) => {
    await assertNoDecryptionErrors(page);
  });
});
