import {
  html,
  fixture,
  expect,
  oneEvent,
  elementUpdated,
  fixtureCleanup,
} from "@open-wc/testing";
import "./sketch-chat-input";
import { SketchChatInput } from "./sketch-chat-input";

describe("SketchChatInput", () => {
  afterEach(() => {
    fixtureCleanup();
  });

  it("initializes with empty content by default", async () => {
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input></sketch-chat-input>
    `);

    expect(el.content).to.equal("");
    const textarea = el.shadowRoot!.querySelector(
      "#chatInput",
    ) as HTMLTextAreaElement;
    expect(textarea.value).to.equal("");
  });

  it("initializes with provided content", async () => {
    const testContent = "Hello, world!";
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input .content=${testContent}></sketch-chat-input>
    `);

    expect(el.content).to.equal(testContent);
    const textarea = el.shadowRoot!.querySelector(
      "#chatInput",
    ) as HTMLTextAreaElement;
    expect(textarea.value).to.equal(testContent);
  });

  it("updates content when typing in the textarea", async () => {
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input></sketch-chat-input>
    `);

    const textarea = el.shadowRoot!.querySelector(
      "#chatInput",
    ) as HTMLTextAreaElement;
    const newValue = "New message";

    textarea.value = newValue;
    textarea.dispatchEvent(new Event("input"));

    expect(el.content).to.equal(newValue);
  });

  it("sends message when clicking the send button", async () => {
    const testContent = "Test message";
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input .content=${testContent}></sketch-chat-input>
    `);

    const button = el.shadowRoot!.querySelector(
      "#sendChatButton",
    ) as HTMLButtonElement;

    // Setup listener for the send-chat event
    setTimeout(() => button.click());
    const { detail } = await oneEvent(el, "send-chat");

    expect(detail.message).to.equal(testContent);
    expect(el.content).to.equal("");
  });

  it("sends message when pressing Enter (without shift)", async () => {
    const testContent = "Test message";
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input .content=${testContent}></sketch-chat-input>
    `);

    const textarea = el.shadowRoot!.querySelector(
      "#chatInput",
    ) as HTMLTextAreaElement;

    // Setup listener for the send-chat event
    setTimeout(() => {
      const enterEvent = new KeyboardEvent("keydown", {
        key: "Enter",
        bubbles: true,
        cancelable: true,
        shiftKey: false,
      });
      textarea.dispatchEvent(enterEvent);
    });

    const { detail } = await oneEvent(el, "send-chat");

    expect(detail.message).to.equal(testContent);
    expect(el.content).to.equal("");
  });

  it("does not send message when pressing Shift+Enter", async () => {
    const testContent = "Test message";
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input .content=${testContent}></sketch-chat-input>
    `);

    const textarea = el.shadowRoot!.querySelector(
      "#chatInput",
    ) as HTMLTextAreaElement;

    // Create a flag to track if the event was fired
    let eventFired = false;
    el.addEventListener("send-chat", () => {
      eventFired = true;
    });

    // Dispatch the shift+enter keydown event
    const shiftEnterEvent = new KeyboardEvent("keydown", {
      key: "Enter",
      bubbles: true,
      cancelable: true,
      shiftKey: true,
    });
    textarea.dispatchEvent(shiftEnterEvent);

    // Wait a short time to verify no event was fired
    await new Promise((resolve) => setTimeout(resolve, 10));

    expect(eventFired).to.be.false;
    expect(el.content).to.equal(testContent);
  });

  it("updates content when receiving update-content event", async () => {
    const el: SketchChatInput = await fixture(html`
      <sketch-chat-input></sketch-chat-input>
    `);

    const newContent = "Updated content";

    // Dispatch the update-content event
    const updateEvent = new CustomEvent("update-content", {
      detail: { content: newContent },
      bubbles: true,
    });
    el.dispatchEvent(updateEvent);

    // Wait for the component to update
    await elementUpdated(el);

    expect(el.content).to.equal(newContent);
    const textarea = el.shadowRoot!.querySelector(
      "#chatInput",
    ) as HTMLTextAreaElement;
    expect(textarea.value).to.equal(newContent);
  });
});
