#!/usr/bin/env node
import fs from 'fs'
import path from 'path'
import walk from 'walk-sync'
import frontmatter from '../../lib/read-frontmatter.js'
import { loadPages, loadPageMap } from '../../lib/page-data.js'
import patterns from '../../lib/patterns.js'
import loadRedirects from '../../lib/redirects/precompile.js'
import { allVersionKeys } from '../../lib/all-versions.js'

// get all content and data files
const files = ['content', 'data']
  .map((dir) => {
    return walk(path.join(process.cwd(), dir), {
      includeBasePath: true,
      directories: false,
    }).filter((file) => file.endsWith('.md') && !file.endsWith('README.md'))
  })
  .flat()

// match [foo](/v3) and [bar](/v4) Markdown links
const linkRegex = /\(\/v[34].*?\)/g

main()

async function main() {
  // we need to load the pages so we can get the redirects
  const englishPages = (await loadPages()).filter((p) => p.languageCode === 'en')
  const englishPageMap = await loadPageMap(englishPages)
  const redirects = await loadRedirects(englishPages, englishPageMap)

  for (const file of files) {
    const { data, content } = frontmatter(fs.readFileSync(file, 'utf8'))

    const links = content.match(linkRegex)
    if (!links) continue

    // remove parentheses: (/v3) -> /v3
    // also remove trailing slash before closing parens if there is one
    const devLinks = links.map((link) => link.replace('(', '').replace(/\/?\)/, ''))

    let newContent = content

    for (const devLink of devLinks) {
      const [link, fragment] = devLink.split(/\/?#/)

      let redirect = redirects[link]

      if (!redirect) {
        console.log(`no redirect found for ${devLink} in ${file}`)
        continue
      }

      // do some cleanup
      redirect = redirect
        // remove language code segment
        .replace(patterns.getLanguageCode, '')
        // remove version segment
        .replace(new RegExp(`/(${allVersionKeys.join('|')})`), '')

      // re-add the fragment after removing any fragment added via the redirect
      // otherwise /v3/git/refs/#create-a-reference will become /rest/reference/git#refs#create-a-reference
      // we want to preserve the #create-a-reference fragment, not #refs
      const newLink = fragment ? redirect.replace(/#.+?$/, '') + '#' + fragment : redirect

      // first replace the old link with the new link
      // then remove any trailing slashes
      newContent = newContent.replace(new RegExp(`${devLink}/?(?=\\))`), newLink)
    }

    fs.writeFileSync(file, frontmatter.stringify(newContent, data, { lineWidth: 10000 }))
  }
  console.log('Done!')
}