// Manga-specific settings integration
// Feature Registration Pattern implementation

import type { ReaderContext } from "../core/reader-context";

export function init(context: ReaderContext): void {
  let currentSettings: MangaSettings | null = null;

  context.events.on("reader:loaded", async () => {
    currentSettings = await getMangaSettings();
    applyMangaSettings(currentSettings);
    context.events.emit("manga-settings:loaded", currentSettings);
  });

  context.events.on("manga-settings:update", async (detail: { settings: Partial<MangaSettings> }) => {
    if (currentSettings) {
      currentSettings = { ...currentSettings, ...detail.settings };
      await updateMangaSettings(detail.settings);
      applyMangaSettings(currentSettings);
      context.events.emit("manga-settings:changed", currentSettings);
    }
  });

  context.events.on("manga-settings:get", () => {
    if (currentSettings) {
      context.events.emit("manga-settings:current", currentSettings);
    }
  });
}

interface MangaSettings {
  readingDirection: "auto" | "ltr" | "rtl" | "vertical";
  verticalScrollSpeed: "slow" | "normal" | "fast";
  rtlPageTransition: "slide" | "fade" | "none";
  webtoonMode: boolean;
}

async function getMangaSettings(): Promise<MangaSettings> {
  const defaultSettings: MangaSettings = {
    readingDirection: "auto",
    verticalScrollSpeed: "normal",
    rtlPageTransition: "slide",
    webtoonMode: false,
  };

  try {
    const userId = localStorage.getItem("userId");
    const response = await fetch(`/api/users/${userId}/settings`);

    if (response.ok) {
      const settings = await response.json();
      return { ...defaultSettings, ...settings };
    }
  } catch (error) {
    console.error("Failed to load manga settings:", error);
  }

  return defaultSettings;
}

async function updateMangaSettings(
  settings: Partial<MangaSettings>,
): Promise<void> {
  const userId = localStorage.getItem("userId");

  try {
    const response = await fetch(`/api/users/${userId}/settings`, {
      method: "PUT",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${localStorage.getItem("token")}`,
      },
      body: JSON.stringify(settings),
    });

    if (!response.ok) {
      throw new Error("Failed to update manga settings");
    }
  } catch (error) {
    console.error("Failed to save manga settings:", error);
  }
}

function applyMangaSettings(settings: MangaSettings): void {
  document.documentElement.dataset.readingDirection = settings.readingDirection;

  if (settings.verticalScrollSpeed === "slow") {
    document.documentElement.style.scrollBehavior = "smooth";
  } else if (settings.verticalScrollSpeed === "fast") {
    document.documentElement.style.scrollBehavior = "auto";
  }

  if (settings.rtlPageTransition !== "none") {
    document.documentElement.dataset.pageTransition =
      settings.rtlPageTransition;
  }

  document.documentElement.dataset.webtoonMode = String(settings.webtoonMode);
}