/**
 * Demo fixture for sketch-chat-input component
 */

import { DemoModule } from "./demo-framework/types";
import { demoUtils } from "./demo-fixtures/index";

const demo: DemoModule = {
  title: "Chat Input Component",
  description: "Chat input with file upload and drag-and-drop support",
  imports: ["../sketch-chat-input"],

  setup: async (container: HTMLElement) => {
    // Create demo sections
    const basicSection = demoUtils.createDemoSection(
      "Basic Chat Input",
      "Type a message and press Enter or click Send. Supports file drag-and-drop.",
    );

    const messagesSection = demoUtils.createDemoSection(
      "Chat Messages",
      "Sent messages will appear here",
    );

    // Create messages display
    const messagesDiv = document.createElement("div");
    messagesDiv.id = "chat-messages";
    messagesDiv.className =
      "min-h-[100px] max-h-[200px] overflow-y-auto border border-gray-300 rounded-md p-3 mb-3 bg-gray-50";

    // Create chat input
    const chatInput = document.createElement("sketch-chat-input") as any;

    // Add message display function
    const addMessage = (
      message: string,
      isUser: boolean = true,
      timestamp?: Date,
    ) => {
      const messageDiv = document.createElement("div");
      messageDiv.className = `p-2 my-1 rounded max-w-xs ${
        isUser
          ? "bg-blue-500 text-white ml-auto"
          : "bg-gray-200 text-gray-900 mr-auto"
      }`;

      const timeStr = timestamp
        ? timestamp.toLocaleTimeString()
        : new Date().toLocaleTimeString();
      messageDiv.innerHTML = `
        <div class="text-sm">${message}</div>
        <div class="text-xs opacity-70 mt-1">${timeStr}</div>
      `;

      messagesDiv.appendChild(messageDiv);
      messagesDiv.scrollTop = messagesDiv.scrollHeight;
    };

    // Handle send events
    chatInput.addEventListener("send-chat", (evt: any) => {
      const message = evt.detail.message;
      if (message.trim()) {
        addMessage(message, true);

        // Simulate bot response after a delay
        setTimeout(() => {
          const responses = [
            "Message received!",
            "Thanks for sharing that.",
            "I see you uploaded a file.",
            "Processing your request...",
            "How can I help you further?",
          ];
          const randomResponse =
            responses[Math.floor(Math.random() * responses.length)];
          addMessage(randomResponse, false);
        }, 1500);
      }
    });

    // Add initial messages
    addMessage("Welcome to the chat input demo!", false);
    addMessage("Try typing a message or dragging files here.", false);

    // Control buttons
    const controlsDiv = document.createElement("div");
    controlsDiv.className = "mt-4 space-x-2";

    const clearButton = demoUtils.createButton("Clear Chat", () => {
      messagesDiv.innerHTML = "";
      addMessage("Chat cleared!", false);
    });

    const presetButton = demoUtils.createButton("Load Sample Message", () => {
      chatInput.content =
        "I need help with implementing a file upload feature. Can you review the attached screenshot?";
    });

    const multilineButton = demoUtils.createButton("Multiline Message", () => {
      chatInput.content =
        "Here's a multiline message:\n\n1. First point\n2. Second point\n3. Third point\n\nWhat do you think?";
    });

    controlsDiv.appendChild(clearButton);
    controlsDiv.appendChild(presetButton);
    controlsDiv.appendChild(multilineButton);

    // File upload status section
    const statusSection = demoUtils.createDemoSection(
      "Upload Status",
      "Current upload status and file handling",
    );

    const statusDiv = document.createElement("div");
    statusDiv.className =
      "bg-blue-50 border border-blue-200 rounded p-3 text-sm";
    statusDiv.innerHTML = `
      <div>✓ Drag and drop files onto the chat input</div>
      <div>✓ Paste images from clipboard</div>
      <div>✓ Multiple file uploads supported</div>
      <div>✓ Upload progress indication</div>
    `;

    statusSection.appendChild(statusDiv);

    // Assemble the demo
    messagesSection.appendChild(messagesDiv);
    basicSection.appendChild(chatInput);
    basicSection.appendChild(controlsDiv);

    container.appendChild(messagesSection);
    container.appendChild(basicSection);
    container.appendChild(statusSection);
  },
};

export default demo;
