
// Sanity integration — uses HTTP API directly (no @sanity/client, no build step)

const SANITY_PROJECT_ID = "apr4f73i";
const SANITY_DATASET = "production";
const SANITY_API_VERSION = "2024-01-01";

const sanityFetch = async (query, params = {}) => {
  const url = new URL(
    `https://${SANITY_PROJECT_ID}.api.sanity.io/v${SANITY_API_VERSION}/data/query/${SANITY_DATASET}`
  );
  url.searchParams.set("query", query);
  for (const [k, v] of Object.entries(params)) {
    url.searchParams.set(`$${k}`, JSON.stringify(v));
  }
  const res = await fetch(url.toString());
  if (!res.ok) throw new Error(`Sanity ${res.status}`);
  const { result } = await res.json();
  return result;
};

// Sanity asset refs are: image-{id}-{width}x{height}-{format}
// {id} can contain hyphens, so we parse from the end.
const sanityImageUrl = (image, opts = {}) => {
  if (!image?.asset?._ref) return null;
  const parts = image.asset._ref.split("-");
  if (parts.length < 4) return null;
  const format = parts[parts.length - 1];
  const dims = parts[parts.length - 2];
  const id = parts.slice(1, -2).join("-");
  const params = new URLSearchParams();
  if (opts.width)   params.set("w", String(opts.width));
  if (opts.height)  params.set("h", String(opts.height));
  if (opts.quality) params.set("q", String(opts.quality));
  if (opts.fit)     params.set("fit", opts.fit);
  if (opts.auto !== false) params.set("auto", "format");
  const qs = params.toString();
  return `https://cdn.sanity.io/images/${SANITY_PROJECT_ID}/${SANITY_DATASET}/${id}-${dims}.${format}${qs ? `?${qs}` : ""}`;
};

const PROJECTS_QUERY = `*[_type == "project"] | order(coalesce(year, "0") desc, _createdAt desc) {
  _id,
  title,
  subtitle,
  description,
  technologies,
  year,
  siteUrl,
  githubUrl,
  mainImage
}`;

function useSanityProjects() {
  const [state, setState] = React.useState({ status: "loading", items: [], error: null });

  React.useEffect(() => {
    let alive = true;
    sanityFetch(PROJECTS_QUERY)
      .then((items) => {
        if (alive) setState({ status: "ready", items: items || [], error: null });
      })
      .catch((err) => {
        if (alive) setState({ status: "error", items: [], error: err });
      });
    return () => { alive = false; };
  }, []);

  return state;
}

// Reads a localized field ({fr, en}) for the given lang.
// Falls back to fr → en → "". Plain strings (legacy non-localized docs) pass through.
const pickLocale = (field, lang) => {
  if (field == null) return "";
  if (typeof field === "string") return field;
  return field[lang] || field.fr || field.en || "";
};

Object.assign(window, { sanityFetch, sanityImageUrl, useSanityProjects, pickLocale });