import test from "node:test";
import assert from "node:assert/strict";
import React from "react";
import { renderToStaticMarkup } from "react-dom/server";

const { default: RequestLoggerDetail } =
  await import("../../src/shared/components/RequestLoggerDetail.tsx");

function renderDetailWithSourceFormat(sourceFormat: string) {
  return renderToStaticMarkup(
    React.createElement(RequestLoggerDetail, {
      log: {
        status: 200,
        method: "POST",
        path: "/v1/chat/completions",
        timestamp: "2026-04-09T21:27:08.000Z",
        duration: 2500,
        provider: "openrouter",
        sourceFormat,
        model: "deepseek/deepseek-v4-pro",
        requestedModel: "openrouter/deepseek/deepseek-v4-pro",
        cacheSource: "upstream",
        tokens: {
          in: 10,
          out: 2,
          cacheRead: null,
          cacheWrite: null,
          reasoning: null,
        },
      },
      detail: {
        requestedModel: "openrouter/deepseek/deepseek-v4-pro",
        cacheSource: "upstream",
        tokens: {
          in: 10,
          out: 2,
          cacheRead: null,
          cacheWrite: null,
          reasoning: null,
        },
      },
      loading: false,
      onClose: () => {},
      onCopy: async () => true,
    })
  );
}

test("request log detail splits token badges into input and output groups", () => {
  const html = renderToStaticMarkup(
    React.createElement(RequestLoggerDetail, {
      log: {
        status: 200,
        method: "POST",
        path: "/v1/chat/completions",
        timestamp: "2026-04-09T21:27:08.000Z",
        duration: 2500,
        provider: "openai-compatible-sp-openai",
        sourceFormat: "openai-chat",
        model: "gpt-5.4",
        requestedModel: "openai-compatible-sp-openai/gpt-5.4",
        account: "main",
        apiKeyName: "tools",
        apiKeyId: "29d9***7e37",
        comboName: "_Latest-Discounted",
        cacheSource: "semantic",
        tokens: {
          in: 21818,
          out: 42,
          cacheRead: 21632,
          cacheWrite: null,
          reasoning: null,
        },
      },
      detail: {
        account: "main",
        apiKeyName: "tools",
        apiKeyId: "29d9***7e37",
        comboName: "_Latest-Discounted",
        requestedModel: "openai-compatible-sp-openai/gpt-5.4",
        cacheSource: "semantic",
        tokens: {
          in: 21818,
          out: 42,
          cacheRead: 21632,
          cacheWrite: null,
          reasoning: null,
        },
      },
      loading: false,
      onClose: () => {},
      onCopy: async () => true,
    })
  );

  const inputLabelIndex = html.indexOf(">Input<");
  const outputLabelIndex = html.indexOf(">Output<");
  const modelLabelIndex = html.indexOf(">Model<");
  const requestedModelLabelIndex = html.indexOf(">Requested Model<");

  assert.notEqual(html.indexOf(">Completed Time<"), -1);
  assert.equal(html.includes(">Time<"), false);
  assert.notEqual(inputLabelIndex, -1);
  assert.notEqual(outputLabelIndex, -1);
  assert.notEqual(modelLabelIndex, -1);
  assert.notEqual(requestedModelLabelIndex, -1);
  assert.equal(html.includes(">Tokens<"), false);
  assert.equal(inputLabelIndex < outputLabelIndex, true);
  assert.equal(outputLabelIndex < modelLabelIndex, true);
  assert.equal(modelLabelIndex < requestedModelLabelIndex, true);
  assert.notEqual(html.indexOf(">Cache Source<"), -1);
  assert.notEqual(html.indexOf(">Semantic (OmniRoute)<"), -1);
  assert.notEqual(html.indexOf(">OpenAI-Chat<"), -1);

  assert.match(
    html,
    /data-testid="token-group-input"[\s\S]*Total In: 21[\s\S]*818[\s\S]*Cache Read: 21[\s\S]*632[\s\S]*Cache Write: N\/A/
  );
  assert.match(html, /data-testid="token-group-output"[\s\S]*Total Out: 42[\s\S]*Reasoning: N\/A/);
});

test("request log detail labels OpenAI protocol variants explicitly", () => {
  const chatHtml = renderDetailWithSourceFormat("openai");
  const responsesHtml = renderDetailWithSourceFormat("openai-responses");

  assert.notEqual(chatHtml.indexOf(">OpenAI-Chat<"), -1);
  assert.notEqual(responsesHtml.indexOf(">OpenAI-Responses<"), -1);
});

test("request log detail follows the email visibility setting for accounts", () => {
  const props = {
    log: {
      status: 200,
      method: "POST",
      path: "/v1/responses",
      timestamp: "2026-04-09T21:27:08.000Z",
      duration: 2500,
      provider: "codex",
      sourceFormat: "openai-responses",
      model: "gpt-5.5",
      account: "logs.user@example.com",
      tokens: { in: 10, out: 2 },
    },
    detail: {
      account: "logs.user@example.com",
      tokens: { in: 10, out: 2 },
    },
    loading: false,
    onClose: () => {},
    onCopy: async () => true,
  };

  const hiddenHtml = renderToStaticMarkup(
    React.createElement(RequestLoggerDetail, { ...props, emailsVisible: false })
  );
  const visibleHtml = renderToStaticMarkup(
    React.createElement(RequestLoggerDetail, { ...props, emailsVisible: true })
  );

  assert.match(hiddenHtml, /log\*{6}@\*{8}com/);
  assert.equal(hiddenHtml.includes("logs.user@example.com"), false);
  assert.notEqual(visibleHtml.indexOf("logs.user@example.com"), -1);
});
