"use client";

import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
import { L, Lang, t } from "@/lib/i18n";
import { toolById, toolsByCat } from "@/data/tools";

type TKey = keyof typeof t;

interface AppState {
  lang: Lang;
  setLang: (l: Lang) => void;
  /** current open tool id (workbench) */
  tool: string | null;
  openTool: (id: string, presetFile?: File) => void;
  closeTool: () => void;
  presetFile: File | null;
  T: (key: TKey) => string;
}

const Ctx = createContext<AppState | null>(null);

export function AppProvider({ children }: { children: React.ReactNode }) {
  const [lang, setLangState] = useState<Lang>("en");
  const [tool, setTool] = useState<string | null>(null);
  const [presetFile, setPresetFile] = useState<File | null>(null);

  useEffect(() => {
    const saved = localStorage.getItem("fd-lang");
    // eslint-disable-next-line react-hooks/set-state-in-effect
    if (saved === "bn" || saved === "en") setLangState(saved);
  }, []);

  const setLang = useCallback((l: Lang) => {
    setLangState(l);
    localStorage.setItem("fd-lang", l);
    document.documentElement.lang = l === "bn" ? "bn" : "en";
  }, []);

  const openTool = useCallback((id: string, file?: File) => {
    setPresetFile(file ?? null);
    setTool(id);
  }, []);

  const closeTool = useCallback(() => {
    setTool(null);
    setPresetFile(null);
  }, []);

  const T = useCallback((key: TKey) => L(key, lang), [lang]);

  const value = useMemo(
    () => ({ lang, setLang, tool, openTool, closeTool, presetFile, T }),
    [lang, setLang, tool, openTool, closeTool, presetFile, T],
  );

  return <Ctx.Provider value={value}>{children}</Ctx.Provider>;
}

export function useApp(): AppState {
  const v = useContext(Ctx);
  if (!v) throw new Error("useApp outside provider");
  return v;
}

/** helper hook: tool nav data */
export function useToolsNav() {
  return {
    pdf: toolsByCat("pdf"),
    image: toolsByCat("image"),
    ai: toolsByCat("ai"),
    file: toolsByCat("file"),
    byId: toolById,
  };
}
