import { safeGetDOM } from "@astro-community/astro-embed-utils";

/** Helper to get the `content` attribute of an element. */
const getContent = (el: Element | null) => el?.getAttribute("content");
/** Helper to filter out insecure or non-absolute URLs. */
const urlOrNull = (url: string | null | undefined) =>
  url?.slice(0, 8) === "https://" ? url : null;

/**
 * Loads and parses an HTML page to return Open Graph metadata.
 * @param pageUrl URL to parse
 */
export async function parseOpenGraph(pageUrl: string) {
  const html = await safeGetDOM(pageUrl);
  if (!html) return;

  const getMetaProperty = (prop: string) =>
    getContent(html.querySelector(`meta[property=${JSON.stringify(prop)}]`));
  const getMetaName = (name: string) =>
    getContent(html.querySelector(`meta[name=${JSON.stringify(name)}]`));

  const title =
    getMetaProperty("og:title") || html.querySelector("title")?.textContent;
  const description =
    getMetaProperty("og:description") || getMetaName("description");
  const image = urlOrNull(
    getMetaProperty("og:image:secure_url") ||
      getMetaProperty("og:image:url") ||
      getMetaProperty("og:image"),
  );
  const imageAlt = getMetaProperty("og:image:alt");
  const video = urlOrNull(
    getMetaProperty("og:video:secure_url") ||
      getMetaProperty("og:video:url") ||
      getMetaProperty("og:video"),
  );
  const videoType = getMetaProperty("og:video:type");
  const url =
    urlOrNull(
      getMetaProperty("og:url") ||
        html.querySelector("link[rel='canonical']")?.getAttribute("href"),
    ) || pageUrl;

  return { title, description, image, imageAlt, url, video, videoType };
}
