/* eslint-disable @typescript-eslint/no-explicit-any */
/**
 * Demo module for sketch-call-status component
 */

import { DemoModule } from "./demo-framework/types";
import {
  demoUtils,
  idleCallStatus,
  workingCallStatus,
  heavyWorkingCallStatus,
  disconnectedCallStatus,
  workingDisconnectedCallStatus,
} from "./demo-fixtures/index";
import type { CallStatusState } from "./demo-fixtures/index";

const demo: DemoModule = {
  title: "Call Status Demo",
  description:
    "Display current LLM and tool call status with visual indicators",
  imports: ["../sketch-call-status"],
  styles: ["/dist/tailwind.css"],

  setup: async (container: HTMLElement) => {
    // Create demo sections
    const statusVariationsSection = demoUtils.createDemoSection(
      "Status Variations",
      "Different states of the call status component",
    );

    const interactiveSection = demoUtils.createDemoSection(
      "Interactive Demo",
      "Dynamically change call status to see real-time updates",
    );

    // Helper function to create status component with state
    const createStatusComponent = (
      id: string,
      state: CallStatusState,
      label: string,
    ) => {
      const wrapper = document.createElement("div");
      wrapper.style.cssText =
        "margin: 15px 0; padding: 10px; border: 1px solid #e1e5e9; border-radius: 6px; background: white;";

      const labelEl = document.createElement("h4");
      labelEl.textContent = label;
      labelEl.style.cssText =
        "margin: 0 0 10px 0; color: var(--demo-label-color); font-size: 14px; font-weight: 600;";

      const statusComponent = document.createElement(
        "sketch-call-status",
      ) as any;
      statusComponent.id = id;
      statusComponent.llmCalls = state.llmCalls;
      statusComponent.toolCalls = state.toolCalls;
      statusComponent.agentState = state.agentState;
      statusComponent.isIdle = state.isIdle;
      statusComponent.isDisconnected = state.isDisconnected;

      wrapper.appendChild(labelEl);
      wrapper.appendChild(statusComponent);
      return wrapper;
    };

    // Create status variations
    const idleStatus = createStatusComponent(
      "idle-status",
      idleCallStatus,
      "Idle State - No active calls",
    );

    const workingStatus = createStatusComponent(
      "working-status",
      workingCallStatus,
      "Working State - LLM and tool calls active",
    );

    const heavyWorkingStatus = createStatusComponent(
      "heavy-working-status",
      heavyWorkingCallStatus,
      "Heavy Working State - Multiple calls active",
    );

    const disconnectedStatus = createStatusComponent(
      "disconnected-status",
      disconnectedCallStatus,
      "Disconnected State - No connection",
    );

    const workingDisconnectedStatus = createStatusComponent(
      "working-disconnected-status",
      workingDisconnectedCallStatus,
      "Working but Disconnected - Calls active but no connection",
    );

    // Interactive demo component
    const interactiveStatus = document.createElement(
      "sketch-call-status",
    ) as any;
    interactiveStatus.id = "interactive-status";
    interactiveStatus.llmCalls = 0;
    interactiveStatus.toolCalls = [];
    interactiveStatus.agentState = null;
    interactiveStatus.isIdle = true;
    interactiveStatus.isDisconnected = false;

    // Control buttons for interactive demo
    const controlsDiv = document.createElement("div");
    controlsDiv.style.cssText =
      "margin-top: 20px; display: flex; flex-wrap: wrap; gap: 10px;";

    const addLLMCallButton = demoUtils.createButton("Add LLM Call", () => {
      interactiveStatus.llmCalls = interactiveStatus.llmCalls + 1;
      interactiveStatus.isIdle = false;
    });

    const removeLLMCallButton = demoUtils.createButton(
      "Remove LLM Call",
      () => {
        interactiveStatus.llmCalls = Math.max(
          0,
          interactiveStatus.llmCalls - 1,
        );
        if (
          interactiveStatus.llmCalls === 0 &&
          interactiveStatus.toolCalls.length === 0
        ) {
          interactiveStatus.isIdle = true;
        }
      },
    );

    const addToolCallButton = demoUtils.createButton("Add Tool Call", () => {
      const toolNames = [
        "bash",
        "patch",
        "think",
        "keyword_search",
        "browser_navigate",
        "codereview",
      ];
      const randomTool =
        toolNames[Math.floor(Math.random() * toolNames.length)];
      const currentTools = Array.isArray(interactiveStatus.toolCalls)
        ? [...interactiveStatus.toolCalls]
        : [];
      if (!currentTools.includes(randomTool)) {
        currentTools.push(randomTool);
        interactiveStatus.toolCalls = currentTools;
        interactiveStatus.isIdle = false;
      }
    });

    const removeToolCallButton = demoUtils.createButton(
      "Remove Tool Call",
      () => {
        const currentTools = Array.isArray(interactiveStatus.toolCalls)
          ? [...interactiveStatus.toolCalls]
          : [];
        if (currentTools.length > 0) {
          currentTools.pop();
          interactiveStatus.toolCalls = currentTools;
          if (interactiveStatus.llmCalls === 0 && currentTools.length === 0) {
            interactiveStatus.isIdle = true;
          }
        }
      },
    );

    const toggleConnectionButton = demoUtils.createButton(
      "Toggle Connection",
      () => {
        interactiveStatus.isDisconnected = !interactiveStatus.isDisconnected;
      },
    );

    const setAgentStateButton = demoUtils.createButton(
      "Change Agent State",
      () => {
        const states = [
          null,
          "analyzing code",
          "refactoring components",
          "running tests",
          "reviewing changes",
          "generating documentation",
        ];
        const currentIndex = states.indexOf(interactiveStatus.agentState);
        const nextIndex = (currentIndex + 1) % states.length;
        interactiveStatus.agentState = states[nextIndex];
      },
    );

    const resetButton = demoUtils.createButton("Reset to Idle", () => {
      interactiveStatus.llmCalls = 0;
      interactiveStatus.toolCalls = [];
      interactiveStatus.agentState = null;
      interactiveStatus.isIdle = true;
      interactiveStatus.isDisconnected = false;
    });

    controlsDiv.appendChild(addLLMCallButton);
    controlsDiv.appendChild(removeLLMCallButton);
    controlsDiv.appendChild(addToolCallButton);
    controlsDiv.appendChild(removeToolCallButton);
    controlsDiv.appendChild(toggleConnectionButton);
    controlsDiv.appendChild(setAgentStateButton);
    controlsDiv.appendChild(resetButton);

    // Assemble the demo
    statusVariationsSection.appendChild(idleStatus);
    statusVariationsSection.appendChild(workingStatus);
    statusVariationsSection.appendChild(heavyWorkingStatus);
    statusVariationsSection.appendChild(disconnectedStatus);
    statusVariationsSection.appendChild(workingDisconnectedStatus);

    const interactiveWrapper = document.createElement("div");
    interactiveWrapper.style.cssText =
      "padding: 10px; border: 1px solid #e1e5e9; border-radius: 6px; background: white;";
    interactiveWrapper.appendChild(interactiveStatus);
    interactiveWrapper.appendChild(controlsDiv);
    interactiveSection.appendChild(interactiveWrapper);

    container.appendChild(statusVariationsSection);
    container.appendChild(interactiveSection);

    // Add some simulation of real activity
    const simulationInterval = setInterval(() => {
      const statusComponents = [
        document.getElementById("working-status") as any,
        document.getElementById("heavy-working-status") as any,
      ].filter(Boolean);

      statusComponents.forEach((statusEl) => {
        if (statusEl && Math.random() > 0.8) {
          // 20% chance to update
          // Simulate some activity by slightly changing the number of calls
          const variation = Math.floor(Math.random() * 3) - 1; // -1, 0, or 1
          statusEl.llmCalls = Math.max(0, statusEl.llmCalls + variation);
        }
      });
    }, 2000);

    // Store interval for cleanup
    (container as any).demoInterval = simulationInterval;
  },

  cleanup: async () => {
    // Clear any intervals
    const container = document.getElementById("demo-container");
    if (container && (container as any).demoInterval) {
      clearInterval((container as any).demoInterval);
      delete (container as any).demoInterval;
    }
  },
};

export default demo;
