import { useCallback, useEffect, useState } from "react";
import { fetchMapColorThresholds, updateMapColorThresholds } from "../api/config";
import { handleFetchError } from "../utils/fetchError";
import type {
  MapColorThresholdsResponse,
  MapColorThresholdsUpdate,
} from "../types/config";

export interface UseMapColorThresholdsResult {
  thresholds: MapColorThresholdsResponse | null;
  loading: boolean;
  error: string | null;
  refresh: () => Promise<void>;
  updateThresholds: (payload: MapColorThresholdsUpdate) => Promise<MapColorThresholdsResponse>;
}

export function useMapColorThresholds(): UseMapColorThresholdsResult {
  const [thresholds, setThresholds] = useState<MapColorThresholdsResponse | null>(null);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<string | null>(null);

  const load = useCallback(async (signal?: AbortSignal): Promise<void> => {
    setLoading(true);
    setError(null);

    try {
      const data = await fetchMapColorThresholds(signal);
      if (signal?.aborted) return;
      setThresholds(data);
    } catch (err: unknown) {
      if (signal?.aborted) return;
      handleFetchError(err, setError, "Failed to fetch map color thresholds");
    } finally {
      if (!signal?.aborted) {
        setLoading(false);
      }
    }
  }, []);

  useEffect(() => {
    const controller = new AbortController();
    void load(controller.signal);
    return (): void => {
      controller.abort();
    };
  }, [load]);

  const updateThresholds = useCallback(
    async (payload: MapColorThresholdsUpdate): Promise<MapColorThresholdsResponse> => {
      const updated = await updateMapColorThresholds(payload);
      setThresholds(updated);
      return updated;
    },
    [],
  );

  return {
    thresholds,
    loading,
    error,
    refresh: load,
    updateThresholds,
  };
}
