import { fetchGraphQL } from "../client";
import { SECTIONS_FIELD, SECTIONS_FRAGMENTS, SEO_FIELDS } from "../fragments";
import type { WpReference } from "../types";

const REFERENCE_QUERY = /* GraphQL */ `
  ${SECTIONS_FRAGMENTS}
  query GetReference($slug: ID!) {
    reference(id: $slug, idType: SLUG) {
      id
      slug
      title
      seo ${SEO_FIELDS}
      secteurs {
        nodes {
          id
          slug
          name
        }
      }
      ficheReference {
        clientName
        location
        produit {
          nodes {
            ... on Produit {
              id
              slug
              title
            }
          }
        }
        support
        surface
        metrics {
          value
          label
        }
        quote {
          texte
          auteur
          role
        }
        videoUrl
        showInGrid
      }
      ${SECTIONS_FIELD}
    }
  }
`;

/** Récupère une référence chantier (CPT `reference`, rewrite /references) par slug. */
export async function getReference(slug: string): Promise<WpReference | null> {
  const data = await fetchGraphQL<{ reference: WpReference | null }>(
    REFERENCE_QUERY,
    { slug },
    { tags: ["reference", `reference:${slug}`] }
  );
  return data.reference ?? null;
}

const ALL_REFERENCE_SLUGS_QUERY = /* GraphQL */ `
  query GetAllReferenceSlugs($after: String) {
    references(first: 100, after: $after, where: { status: PUBLISH }) {
      pageInfo {
        hasNextPage
        endCursor
      }
      nodes {
        slug
      }
    }
  }
`;

/** Liste tous les slugs de références publiées (pagination par curseur). */
export async function getAllReferenceSlugs(): Promise<string[]> {
  const slugs: string[] = [];
  let after: string | null = null;
  let hasNextPage = true;

  while (hasNextPage) {
    const data = await fetchGraphQL<{
      references: {
        pageInfo: { hasNextPage: boolean; endCursor: string | null };
        nodes: { slug: string | null }[] | null;
      } | null;
    }>(ALL_REFERENCE_SLUGS_QUERY, { after }, { tags: ["reference"] });

    const references = data.references;
    for (const node of references?.nodes ?? []) {
      if (node.slug) slugs.push(node.slug);
    }
    hasNextPage = Boolean(references?.pageInfo?.hasNextPage);
    after = references?.pageInfo?.endCursor ?? null;
  }

  return slugs;
}
