import { gql } from 'graphql-request'
import fetchAPI from '@/lib/api/fetchAPI'
import { parseGlobalsData } from '@/lib/utilities'
import { MENU_FRAGMENT, THEME_SETTINGS_FRAGMENT, SOCIAL_LINKS_FRAGMENT, SETTINGS_FRAGMENT } from './fragments'

/**
 * Query the global site data
 */
export async function getGlobalFields(preview: boolean) {
  const data = await fetchAPI(
    gql`
      ${SETTINGS_FRAGMENT}
      ${THEME_SETTINGS_FRAGMENT}
      ${SOCIAL_LINKS_FRAGMENT}
      ${MENU_FRAGMENT}
      query GlobalFields {
        settings: generalSettings {
          ...SettingsFields
        }
        themeSettings: acfOptionsThemeSettings {
          ...GlobalSettingsFields
        }
        socialLinks: acfOptionsSocial {
          ...SocialLinkFields
        }
        headerMenu: menu(id: "Header", idType: NAME) {
          ...MenuFields
        }
        footerMenu: menu(id: "Footer", idType: NAME) {
          ...MenuFields
        }
        newsletterForm: gfForm(id: "1", idType: DATABASE_ID) {
          id
          submitButton {
            text
          }
          title
          formFields {
            nodes {
              type
              ... on EmailField {
                label
                placeholder
              }
            }
          }
          confirmations {
            message
          }
        }
      }
    `
  )

  return parseGlobalsData({ ...data, preview })
}

/**
 * Query all site URLs to generate a sitemap
 */
export async function getSitemapPaths() {
  const data = await fetchAPI(
    gql`
      query SitemapPaths {
        pages(first: 10000) {
          edges {
            node {
              uri
            }
          }
        }
        projects(first: 10000) {
          edges {
            node {
              slug
            }
          }
        }
        posts(first: 10000) {
          edges {
            node {
              uri
            }
          }
        }
        caseStudies(first: 10000) {
          edges {
            node {
              slug
            }
          }
        }
      }
    `
  )

  return data
}
