import { db, storage } from "@/utils/firebase-templates";
import { doc, getDoc } from "firebase/firestore";
import { getDownloadURL, ref } from "firebase/storage";

type FirebaseTemplateDoc = {
  id: string;
  name: string;
  defaults?: {
    brandName?: string;
    tagline?: string;
    estYear?: string;
  };
  // Either absolute download URLs OR storage paths
  downloadURLs?: { svg?: string; raster?: string; preview?: string };
  storagePaths?: { svg?: string; raster?: string; preview?: string };
};

async function getDocFrom(coll: string, id: string): Promise<FirebaseTemplateDoc | null> {
  const snap = await getDoc(doc(db, coll, id));
  if (!snap.exists()) return null;
  const data = snap.data() as any;

  // Normalize shape
  const result: FirebaseTemplateDoc = {
    id,
    name: data.name || id,
    defaults: {
      brandName: data.defaults?.brandName ?? data.brandName ?? "Your Brand",
      tagline:   data.defaults?.tagline   ?? data.tagline   ?? "Your Tagline",
      estYear:   data.defaults?.estYear   ?? data.estYear   ?? "2025",
    },
    downloadURLs: data.downloadURLs || {},
    storagePaths: data.storagePaths || {},
  };

  // If URLs aren’t stored, resolve from Storage paths
  const ensureUrl = async (p?: string) => (p ? await getDownloadURL(ref(storage, p)) : undefined);

  if (!result.downloadURLs?.svg && result.storagePaths?.svg) {
    result.downloadURLs = { ...(result.downloadURLs || {}), svg: await ensureUrl(result.storagePaths.svg) };
  }
  if (!result.downloadURLs?.raster && result.storagePaths?.raster) {
    result.downloadURLs = { ...(result.downloadURLs || {}), raster: await ensureUrl(result.storagePaths.raster) };
  }
  if (!result.downloadURLs?.preview && result.storagePaths?.preview) {
    result.downloadURLs = { ...(result.downloadURLs || {}), preview: await ensureUrl(result.storagePaths.preview) };
  }

  return result;
}

/**
 * getTemplateById
 * - Tries 'templates' first, then 'logo_templates'.
 * - Also tries *short* id if you pass "logo-wordmark-*" (your page already attempts this).
 */
export async function getTemplateById(id: string) {
  // prefer new collection
  let t = await getDocFrom("templates", id);
  if (!t) t = await getDocFrom("logo_templates", id);

  // if id includes 'logo-wordmark-', also try short id
  if (!t && id.startsWith("logo-wordmark-")) {
    const shortId = id.replace("logo-wordmark-", "");
    t = await getDocFrom("templates", shortId) || await getDocFrom("logo_templates", shortId);
    if (t) t.id = shortId;
  }

  if (!t) return null;

  // Map to what LogoCustomizerPage.tsx expects to read:
  return {
    id: t.id,
    name: t.name,
    defaults: {
      brandName: t.defaults?.brandName || "Your Brand",
      tagline:   t.defaults?.tagline   || "Your Tagline",
      estYear:   t.defaults?.estYear   || "2025",
    },
    assets: {
      svgDownloadUrl: t.downloadURLs?.svg,
      previewDownloadUrl: t.downloadURLs?.preview || t.downloadURLs?.raster,
    },
  };
}
