"use client";

import { useEffect, useState } from "react";
import { doc, onSnapshot, type DocumentData } from "firebase/firestore";
import { getDb, firebaseConfigured } from "@/lib/firebase";
import { resolveMapEmbedUrl } from "@/lib/map-embed";
import {
  resolveHeroLawImageUrl,
  resolveVisionLawImageUrl,
} from "@/lib/law-images";

function mergeConfigDoc<T extends DocumentData>(fallback: T, remote: DocumentData): T {
  const merged = { ...fallback, ...remote } as T & {
    mapEmbedUrl?: string;
    visionImageUrl?: string;
    heroImageUrl?: string;
  };
  if ("mapEmbedUrl" in merged) {
    merged.mapEmbedUrl = resolveMapEmbedUrl(merged.mapEmbedUrl);
  }
  if ("visionImageUrl" in merged) {
    merged.visionImageUrl = resolveVisionLawImageUrl(merged.visionImageUrl);
  }
  if ("heroImageUrl" in merged) {
    merged.heroImageUrl = resolveHeroLawImageUrl(merged.heroImageUrl);
  }
  return merged as T;
}

export function useConfigDoc<T extends DocumentData>(
  collectionName: string,
  docId: string,
  fallback: T
) {
  const [data, setData] = useState<T>(fallback);
  const [loading, setLoading] = useState(firebaseConfigured);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    if (!firebaseConfigured) {
      setData(fallback);
      setLoading(false);
      return;
    }
    const db = getDb();
    if (!db) {
      setLoading(false);
      return;
    }
    const ref = doc(db, collectionName, docId);
    const unsub = onSnapshot(
      ref,
      (snap) => {
        if (snap.exists()) {
          setData(mergeConfigDoc(fallback, snap.data()));
        } else {
          setData(fallback);
        }
        setLoading(false);
        setError(null);
      },
      (e) => {
        console.error(e);
        setError("Veri dinlenirken hata oluştu.");
        setLoading(false);
      }
    );
    return () => unsub();
    // fallback is intentionally omitted: should be a stable module-level default.
    // eslint-disable-next-line react-hooks/exhaustive-deps -- collectionName/docId drive subscription
  }, [collectionName, docId]);

  return { data, loading, error, ready: !loading };
}
