import { useEffect, useState } from "react";
import type { UTCTimestamp } from "lightweight-charts";

export type Candle = {
  time: UTCTimestamp;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
};

export type Resolution = "1m" | "5m" | "15m" | "30m" | "1h" | "4h" | "1d" | "1w";

const RES_SECONDS: Record<Resolution, number> = {
  "1m": 60,
  "5m": 300,
  "15m": 900,
  "30m": 1800,
  "1h": 3600,
  "4h": 14400,
  "1d": 86400,
  "1w": 604800,
};

// Delta uses "1m", "5m", ... but daily is "1d" and weekly "7d"
const RES_TO_DELTA: Record<Resolution, string> = {
  "1m": "1m",
  "5m": "5m",
  "15m": "15m",
  "30m": "30m",
  "1h": "1h",
  "4h": "4h",
  "1d": "1d",
  "1w": "7d",
};

const BASES = [
  "https://api.india.delta.exchange",
  "https://api.delta.exchange",
];

/** Fetch historical OHLCV from Delta Exchange. Returns most-recent 500 candles. */
export function useDeltaHistory(symbol: string, resolution: Resolution) {
  const [candles, setCandles] = useState<Candle[]>([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    if (!symbol) return;
    let alive = true;
    const controller = new AbortController();

    async function load() {
      setLoading(true);
      setError(null);
      const secs = RES_SECONDS[resolution];
      const end = Math.floor(Date.now() / 1000);
      const start = end - secs * 500;
      const qs = `resolution=${RES_TO_DELTA[resolution]}&symbol=${encodeURIComponent(symbol)}&start=${start}&end=${end}`;
      let lastErr: unknown = null;
      for (const base of BASES) {
        try {
          const res = await fetch(`${base}/v2/history/candles?${qs}`, { signal: controller.signal });
          if (!res.ok) { lastErr = new Error(`${res.status}`); continue; }
          const json = (await res.json()) as { success?: boolean; result?: Array<{ time: number; open: number; high: number; low: number; close: number; volume: number }> };
          if (!json?.result?.length) { lastErr = new Error("empty"); continue; }
          const out: Candle[] = json.result
            .map((r) => ({
              time: r.time as UTCTimestamp,
              open: Number(r.open),
              high: Number(r.high),
              low: Number(r.low),
              close: Number(r.close),
              volume: Number(r.volume) || 0,
            }))
            .sort((a, b) => (a.time as number) - (b.time as number));
          if (alive) { setCandles(out); setLoading(false); }
          return;
        } catch (e) {
          lastErr = e;
        }
      }
      if (alive) {
        setError(lastErr instanceof Error ? lastErr.message : "history failed");
        setCandles([]);
        setLoading(false);
      }
    }
    load();
    return () => { alive = false; controller.abort(); };
  }, [symbol, resolution]);

  return { candles, loading, error, bucketSec: RES_SECONDS[resolution] };
}
