/* eslint-disable @typescript-eslint/no-explicit-any */
import { DemoModule } from "./demo-framework/types";
import { demoUtils } from "./demo-fixtures/index";

const demo: DemoModule = {
  title: "Sketch Monaco Viewer Demo",
  description:
    "Monaco editor with code comparison functionality for different languages",
  imports: ["../sketch-monaco-view.ts"],

  customStyles: `
    button {
      padding: 8px 12px;
      background-color: #4285f4;
      color: white;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      margin-right: 8px;
    }

    button:hover {
      background-color: #3367d6;
    }

    sketch-monaco-view {
      margin-top: 20px;
      height: 500px;
    }
  `,

  setup: async (container: HTMLElement) => {
    const section = demoUtils.createDemoSection(
      "Monaco Code Viewer",
      "Demonstrates the Monaco editor component with side-by-side code comparison for different programming languages.",
    );

    // Create control panel
    const controlPanel = document.createElement("div");
    controlPanel.style.marginBottom = "2rem";
    controlPanel.style.padding = "1rem";
    controlPanel.style.backgroundColor = "#f0f0f0";
    controlPanel.style.borderRadius = "4px";

    const buttonsContainer = document.createElement("div");
    buttonsContainer.style.marginTop = "1rem";

    // Create example buttons
    const jsButton = demoUtils.createButton("Example 1: JavaScript", () => {
      diffEditor.setOriginalCode(
        `function calculateTotal(items) {
  return items
    .map(item => item.price * item.quantity)
    .reduce((a, b) => a + b, 0);
}`,
        "original.js",
      );

      diffEditor.setModifiedCode(
        `function calculateTotal(items) {
  // Apply discount if available
  return items
    .map(item => {
      const price = item.discount ?
        item.price * (1 - item.discount) :
        item.price;
      return price * item.quantity;
    })
    .reduce((a, b) => a + b, 0);
}`,
        "modified.js",
      );
    });

    const htmlButton = demoUtils.createButton("Example 2: HTML", () => {
      diffEditor.setOriginalCode(
        `<!DOCTYPE html>
<html>
<head>
  <title>Demo Page</title>
</head>
<body>
  <h1>Hello World</h1>
  <p>This is a paragraph.</p>
</body>
</html>`,
        "original.html",
      );

      diffEditor.setModifiedCode(
        `<!DOCTYPE html>
<html>
<head>
  <title>Demo Page</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <header>
    <h1>Hello World</h1>
  </header>
  <main>
    <p>This is a paragraph with some <strong>bold</strong> text.</p>
  </main>
  <footer>
    <p>&copy; 2025</p>
  </footer>
</body>
</html>`,
        "modified.html",
      );
    });

    const goButton = demoUtils.createButton("Example 3: Go", () => {
      diffEditor.setOriginalCode(
        `package main

import "fmt"

func main() {
	fmt.Println("Hello, world!")
}`,
        "original.go",
      );

      diffEditor.setModifiedCode(
        `package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Hello, world!")
	fmt.Printf("The time is %s\n", time.Now().Format(time.RFC3339))
}`,
        "modified.go",
      );
    });

    buttonsContainer.appendChild(jsButton);
    buttonsContainer.appendChild(htmlButton);
    buttonsContainer.appendChild(goButton);

    controlPanel.innerHTML = `<p>Select an example to see code comparison in different languages:</p>`;
    controlPanel.appendChild(buttonsContainer);

    // Create the Monaco view component
    const diffEditor = document.createElement("sketch-monaco-view") as any;
    diffEditor.id = "diffEditor";

    // Set initial example
    diffEditor.originalCode = `function hello() {
  console.log("Hello World");
  return true;
}`;

    diffEditor.modifiedCode = `function hello() {
  // Add a comment
  console.log("Hello Updated World");
  return true;
}`;

    section.appendChild(controlPanel);
    section.appendChild(diffEditor);
    container.appendChild(section);
  },
};

export default demo;
