import { useEffect, useState } from "react";

export type ApprovalMode = "manual" | "auto";
const KEY = "delta.trade_approval_mode";
const THRESHOLD_KEY = "delta.trade_threshold";
export const DEFAULT_TRADE_THRESHOLD = 0.6;

export function getApprovalMode(): ApprovalMode {
  if (typeof window === "undefined") return "manual";
  return (localStorage.getItem(KEY) as ApprovalMode) || "manual";
}

export function setApprovalMode(mode: ApprovalMode) {
  localStorage.setItem(KEY, mode);
  window.dispatchEvent(new CustomEvent("delta:approval-mode", { detail: mode }));
}

export function useApprovalMode(): [ApprovalMode, (m: ApprovalMode) => void] {
  const [mode, setMode] = useState<ApprovalMode>("manual");
  useEffect(() => {
    setMode(getApprovalMode());
    const onChange = (e: Event) => setMode((e as CustomEvent<ApprovalMode>).detail);
    const onStorage = (e: StorageEvent) => {
      if (e.key === KEY && e.newValue) setMode(e.newValue as ApprovalMode);
    };
    window.addEventListener("delta:approval-mode", onChange);
    window.addEventListener("storage", onStorage);
    return () => {
      window.removeEventListener("delta:approval-mode", onChange);
      window.removeEventListener("storage", onStorage);
    };
  }, []);
  return [mode, (m) => { setApprovalMode(m); setMode(m); }];
}

function readThreshold(): number {
  if (typeof window === "undefined") return DEFAULT_TRADE_THRESHOLD;
  const raw = Number(localStorage.getItem(THRESHOLD_KEY));
  return Number.isFinite(raw) && raw > 0 && raw <= 1 ? raw : DEFAULT_TRADE_THRESHOLD;
}

export function getTradeThreshold(): number {
  return readThreshold();
}

export function setTradeThreshold(v: number) {
  const clamped = Math.min(0.99, Math.max(0.3, v));
  localStorage.setItem(THRESHOLD_KEY, String(clamped));
  window.dispatchEvent(new CustomEvent("delta:trade-threshold", { detail: clamped }));
}

export function useTradeThreshold(): [number, (v: number) => void] {
  const [v, setV] = useState<number>(DEFAULT_TRADE_THRESHOLD);
  useEffect(() => {
    setV(readThreshold());
    const onChange = (e: Event) => setV((e as CustomEvent<number>).detail);
    const onStorage = (e: StorageEvent) => {
      if (e.key === THRESHOLD_KEY) setV(readThreshold());
    };
    window.addEventListener("delta:trade-threshold", onChange);
    window.addEventListener("storage", onStorage);
    return () => {
      window.removeEventListener("delta:trade-threshold", onChange);
      window.removeEventListener("storage", onStorage);
    };
  }, []);
  return [v, (n) => { setTradeThreshold(n); setV(Math.min(0.99, Math.max(0.3, n))); }];
}
