"use client";
import { useState, useEffect, useRef } from "react";
import type { ActualiteitStatus } from "@/lib/db/regelgeving-db";
import type { Wet } from "@/data/regelgeving";

const INTERVAL_MS = 24 * 3600 * 1000;
const VERTRAGING_MS = 1200;

export interface DagelijkseCheckStatus {
  bezig: boolean;
  voortgang: { huidig: number; totaal: number };
  aantalNietActueel: number;
  klaar: boolean;
}

export function useActualiteitDagelijkseCheck(
  alleWetten: Wet[],
  getStatus: (wetId: string) => ActualiteitStatus | undefined,
  slaOp: (status: ActualiteitStatus) => Promise<void>,
  geladen: boolean
): DagelijkseCheckStatus {
  const [bezig, setBezig] = useState(false);
  const [voortgang, setVoortgang] = useState({ huidig: 0, totaal: 0 });
  const [aantalNietActueel, setAantalNietActueel] = useState(0);
  const [klaar, setKlaar] = useState(false);

  const gestart = useRef(false);
  const alleWettenRef = useRef<Wet[]>(alleWetten);
  const getStatusRef = useRef(getStatus);
  const slaOpRef = useRef(slaOp);

  useEffect(() => { alleWettenRef.current = alleWetten; }, [alleWetten]);
  useEffect(() => { getStatusRef.current = getStatus; }, [getStatus]);
  useEffect(() => { slaOpRef.current = slaOp; }, [slaOp]);

  useEffect(() => {
    if (!geladen || gestart.current) return;
    gestart.current = true;

    const cutoff = Date.now() - INTERVAL_MS;
    const teControleren = alleWettenRef.current.filter((w) => {
      if (!w.bron) return false;
      const s = getStatusRef.current(w.id);
      return !s || new Date(s.datumGecontroleerd).getTime() < cutoff;
    });

    if (teControleren.length === 0) {
      setKlaar(true);
      return;
    }

    setBezig(true);
    setVoortgang({ huidig: 0, totaal: teControleren.length });

    let afgebroken = false;

    async function voerChecksUit() {
      let nietActueel = 0;
      for (let i = 0; i < teControleren.length; i++) {
        if (afgebroken) break;
        const wet = teControleren[i];
        try {
          const params = new URLSearchParams({ url: wet.bron, versie: wet.versie });
          const res = await fetch(`/api/check-actualiteit?${params}`);
          if (res.ok) {
            const data = await res.json();
            const status: ActualiteitStatus = {
              wetId: wet.id,
              datumGecontroleerd: new Date().toISOString(),
              gepubliceerdOp: data.gepubliceerdOp ?? undefined,
              isActueel: data.isActueel ?? true,
              melding: data.melding,
            };
            await slaOpRef.current(status);
            if (status.isActueel === false) nietActueel++;
          }
        } catch {
          // stille fout — volgende wet
        }
        setVoortgang({ huidig: i + 1, totaal: teControleren.length });
        if (i < teControleren.length - 1 && !afgebroken) {
          await new Promise((r) => setTimeout(r, VERTRAGING_MS));
        }
      }
      if (!afgebroken) {
        setAantalNietActueel(nietActueel);
        setBezig(false);
        setKlaar(true);
      }
    }

    voerChecksUit();
    return () => {
      afgebroken = true;
    };
  }, [geladen]);

  return { bezig, voortgang, aantalNietActueel, klaar };
}
