import { getSitemapPaths } from '@/lib/api/globals'
import { nodesFromEdges } from '@/lib/utilities'
import { GetServerSideProps } from 'next'

export default function Sitemap() {}

export const getServerSideProps: GetServerSideProps = async ({ res }) => {
  if (res) {
    const { pages, projects, posts, caseStudies } = await getSitemapPaths()

    const urls = [
      // Pages
      ...mapEdgesToSitemapUrls(
        pages,
        (nodes, location) => {
          return nodes
            .filter(
              node =>
                // Pages to not index
                ![
                  'search-results',
                  'thanks-for-your-request',
                  'thanks-for-the-opportunity',
                  'thanks-for-reaching-out',
                ].some(str => node.uri.includes(str))
            )
            .map(node => ({ ...location, loc: `${process.env.NEXT_PUBLIC_SITE_URL}${node.uri}` }))
        },
        {
          priority: 1,
        }
      ),

      // Posts (blog/news/event)
      ...mapEdgesToSitemapUrls(posts, (nodes, location) => {
        return nodes.map(node => ({ ...location, loc: `${process.env.NEXT_PUBLIC_SITE_URL}${node.uri}` }))
      }),

      // Projects
      ...mapEdgesToSitemapUrls(projects, (nodes, location) => {
        return nodes.map(node => ({ ...location, loc: `${process.env.NEXT_PUBLIC_SITE_URL}/projects/${node.slug}` }))
      }),

      // Case studies
      ...mapEdgesToSitemapUrls(caseStudies, (nodes, location) => {
        return nodes.map(node => ({
          ...location,
          loc: `${process.env.NEXT_PUBLIC_SITE_URL}/case-study/${node.slug}`,
        }))
      }),
    ]

    res.setHeader('Content-Type', 'text/xml')
    res.write(`
      <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        ${urls
          .map(url => {
            return `
              <url>
                <loc>${url.loc}</loc>
                <lastmod>${url.lastmod}</lastmod>
                <changefreq>${url.changefreq}</changefreq>
                <priority>${url.priority}</priority>
              </url>
            `
          })
          .join('')}
      </urlset>
    `)
    res.end()
  }

  return {
    props: {},
  }
}

type SitemapUrl = {
  loc: string
  lastmod: string
  changefreq: string
  priority: number
}

const mapEdgesToSitemapUrls = (
  data: Record<'edges', any>,
  transform: (nodes: any[], options: Omit<SitemapUrl, 'loc'>) => SitemapUrl[],
  options?: Partial<Omit<SitemapUrl, 'loc'>>
) => {
  return transform(nodesFromEdges(data.edges || []), {
    lastmod: new Date().toISOString(),
    changefreq: 'daily',
    priority: 0.7,
    ...options,
  })
}
