/**
 *  Copyright (c) taskylizard. All rights reserved.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import { fetcher } from 'itty-fetcher'

// Look inside tbe docs directory
const GITHUB_REPO = 'https://api.github.com/repos/fmhy/edit/contents/docs/'
const EXCLUDE_FILES = [
  'README.md',
  'index.md',
  'feedback.md',
  'posts.md',
  'sandbox.md'
]
const EXCLUDE_DIRECTORIES = ['posts/']

interface File {
  name: string
  path: string
  sha: string
  size: number
  url: string
  html_url: string
  git_url: string
  download_url: string | null
  type: string
  _links: {
    self: string
    git: string
    html: string
  }
}

export default defineEventHandler(async (event) => {
  let body = '<!-- This is autogenerated content, do not edit manually. -->\n'
  const f = fetcher({
    headers: {
      'User-Agent': 'taskylizard'
    }
  })

  try {
    // Fetch the list of files in the repository
    const files = await f.get<File[]>(GITHUB_REPO)

    // Filter out the excluded files and non-markdown files
    const markdownFiles = files.filter((file: File) => {
      const isExcludedFile = EXCLUDE_FILES.includes(file.name)
      const isInExcludedDirectory = EXCLUDE_DIRECTORIES.some((dir) =>
        file.path.startsWith(dir)
      )
      const isMarkdownFile = file.name.endsWith('.md')

      return isMarkdownFile && !isExcludedFile && !isInExcludedDirectory
    })

    // console.info(markdownFiles.map((f) => f.name))

    // Fetch and concatenate the contents of the markdown files
    const contents = await Promise.all(
      markdownFiles.map(async (file: File) => {
        const content = await f.get<string>(file.download_url)
        return content
      })
    )

    body += contents.join('\n\n')
  } catch (error) {
    return {
      status: 500,
      body: `Error fetching markdown files: ${error.message}`
    }
  }

  // biome-ignore lint/correctness/noUndeclaredVariables: <explanation>
  appendResponseHeader(event, 'content-type', 'text/markdown;charset=utf-8')
  return body
})
