"use client";

import { useEffect } from "react";
import type { SettingsDoc } from "@/models/Settings";

// 1:1 Verhalten aus V1 (assets/js/app.js) übernommen — seitenweit, nicht nur
// im Portfolio, weil V1 das bereits so seit Längerem produktiv einsetzt.
export function CopyProtection({ options }: { options: SettingsDoc["copyProtection"] | undefined }) {
  useEffect(() => {
    if (!options) return;

    document.body.classList.toggle("copy-lock-text", Boolean(options.disableTextSelection));
    document.body.classList.toggle("copy-lock-media", Boolean(options.disableImageDrag));

    const ignoreTarget = (target: EventTarget | null) =>
      target instanceof HTMLElement &&
      Boolean(target.closest('input, textarea, select, button, [contenteditable="true"]'));

    const onContextMenu = (e: MouseEvent) => {
      if (options.disableContextMenu) e.preventDefault();
    };
    const onDragStart = (e: DragEvent) => {
      if (options.disableImageDrag && e.target instanceof HTMLElement && e.target.closest("img")) {
        e.preventDefault();
      }
    };
    const onSelectStart = (e: Event) => {
      if (options.disableTextSelection && !ignoreTarget(e.target)) e.preventDefault();
    };
    const onCopyOrCut = (e: ClipboardEvent) => {
      if (options.disableCopy && !ignoreTarget(e.target)) e.preventDefault();
    };
    const onKeyDown = (e: KeyboardEvent) => {
      const key = e.key.toLowerCase();
      const mod = e.ctrlKey || e.metaKey;

      if (options.disableDevToolsShortcuts && (e.key === "F12" || (mod && e.shiftKey && ["i", "j", "c"].includes(key)))) {
        e.preventDefault();
      }
      if (!mod) return;
      if (options.disableCopy && ["c", "x", "a"].includes(key) && !ignoreTarget(e.target)) e.preventDefault();
      if (options.disableSaveShortcut && key === "s") e.preventDefault();
      if (options.disablePrintShortcut && key === "p") e.preventDefault();
      if (options.disableSourceShortcut && key === "u") e.preventDefault();
    };

    document.addEventListener("contextmenu", onContextMenu);
    document.addEventListener("dragstart", onDragStart);
    document.addEventListener("selectstart", onSelectStart);
    document.addEventListener("copy", onCopyOrCut);
    document.addEventListener("cut", onCopyOrCut);
    document.addEventListener("keydown", onKeyDown);

    return () => {
      document.removeEventListener("contextmenu", onContextMenu);
      document.removeEventListener("dragstart", onDragStart);
      document.removeEventListener("selectstart", onSelectStart);
      document.removeEventListener("copy", onCopyOrCut);
      document.removeEventListener("cut", onCopyOrCut);
      document.removeEventListener("keydown", onKeyDown);
    };
  }, [options]);

  return null;
}
