#!/usr/bin/env node

const path = require('path')
const fs = require('fs')

const SN_API_URL = process.env.SN_API_URL ?? 'http://localhost:3000'
const SN_API_KEY = process.env.SN_API_KEY

const parseFrontMatter = (content) => {
  const lines = content.split('\n')
  if (lines[0] !== '---') {
    throw new Error('failed to parse front matter: start delimiter not found')
  }

  const endIndex = lines.findIndex((line, i) => i > 0 && line === '---')
  if (endIndex === -1) {
    throw new Error('failed to parse front matter: end delimiter not found')
  }

  const meta = {}
  for (let i = 1; i < endIndex; i++) {
    const line = lines[i]
    const [key, ...valueParts] = line.split(':')
    if (key && valueParts.length) {
      meta[key.trim()] = valueParts.join(':').trim()
    }
  }

  return meta
}

const readItem = (name) => {
  const content = fs.readFileSync(path.join(__dirname, name), 'utf8')
  const lines = content.split('\n')
  const startIndex = lines.findIndex((line, i) => i > 0 && line.startsWith('---')) + 1
  return {
    ...parseFrontMatter(content),
    text: lines.slice(startIndex).join('\n')
  }
}

async function upsertDiscussion (variables) {
  if (!SN_API_KEY) {
    throw new Error('SN_API_KEY is not set')
  }

  const response = await fetch(`${SN_API_URL}/api/graphql`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': SN_API_KEY
    },
    body: JSON.stringify({
      query: `
        mutation upsertDiscussion($id: ID!, $sub: String!, $title: String!, $text: String!) {
          upsertDiscussion(id: $id, sub: $sub, title: $title, text: $text) {
            result {
              id
            }
          }
        }
      `,
      variables
    })
  })

  if (response.status !== 200) {
    throw new Error(`failed to upsert discussion: ${response.statusText}`)
  }

  const json = await response.json()
  if (json.errors) {
    throw new Error(json.errors[0].message)
  }

  return json.data
}

const faq = readItem('../docs/user/faq.md')

upsertDiscussion(faq)