# -*- coding: utf-8 -*-
"""
BSD 2-Clause License

Copyright (c) 2020-2021, The FreeBSD Project
Copyright (c) 2020-2021, Sergio Carlavilla <carlavilla@FreeBSD.org>

This script will generate the Table of Contents of the Handbook
"""
#!/usr/bin/env python3

import sys, getopt
import re

languages = []

def setAppendixTitle(language):
  languages = {
    'en': 'Appendix',
    'de': 'Anhang',
    'el': 'Παράρτημα',
    'es': 'Apéndice',
    'fr': 'Annexe',
    'hu': 'függelék',
    'it': 'Appendice',
    'ja': '付録',
    'mn': 'Хавсралт',
    'nl': 'Bijlage',
    'pl': 'Dodatek',
    'pt-br': 'Apêndice',
    'ru': 'Приложение',
    'zh-cn': '附录',
    'zh-tw': '附錄'
  }

  return languages.get(language)

def setPartTitle(language):
  languages = {
    'en': 'Part',
    'de': 'Teil',
    'el': 'Μέρος',
    'es': 'Parte',
    'fr': 'Partie',
    'hu': 'rész',
    'it': 'Parte',
    'ja': 'パート',
    'mn': 'хэсэг',
    'nl': 'Deel',
    'pl': 'Część',
    'pt-br': 'Parte',
    'ru': 'Часть',
    'zh-cn': '部分',
    'zh-tw': '部'
  }

  return languages.get(language)

def setChapterTitle(language):
  languages = {
    'en': 'Chapter',
    'de': 'Kapitel',
    'el': 'Κεφάλαιο',
    'es': 'Capítulo',
    'fr': 'Chapitre',
    'hu': 'Fejezet',
    'it': 'Capitolo',
    'ja': '章',
    'mn': 'Бүлэг',
    'nl': 'Hoofdstuk',
    'pl': 'Rozdział',
    'pt-br': 'Capítulo',
    'ru': 'Глава',
    'zh-cn': '章',
    'zh-tw': '章'
  }

  return languages.get(language)

def setTOCTitle(language):
  languages = {
    'en': 'Table of Contents',
    'de': 'Inhaltsverzeichnis',
    'el': 'Πίνακας Περιεχομένων',
    'es': 'Tabla de contenidos',
    'fr': 'Table des matières',
    'hu': 'Tartalom',
    'it': 'Indice',
    'ja': '目次',
    'mn': 'Гарчиг',
    'nl': 'Inhoudsopgave',
    'pl': 'Spis treści',
    'pt-br': 'Índice',
    'ru': 'Содержание',
    'zh-cn': '目录',
    'zh-tw': '內容目錄'
  }

  return languages.get(language)

def getPartNumber(number):
  numbers = {
    1: 'I',
    2: 'II',
    3: 'III',
    4: 'IV',
    5: 'V'
  }

  return numbers.get(number)

def checkIsPart(chapter):
  if "part" in chapter:
    return True
  return False

def checkIsPreface(chapterContent):
  if "[preface]" in chapterContent:
    return True
  return False

def checkIsAppendix(chapterContent):
  if "[appendix]" in chapterContent:
    return True
  return False

def main(argv):

  try:
    opts, args = getopt.getopt(argv,"hl:",["language="])
  except getopt.GetoptError:
    print('books-toc-creator.py -l <language>')
    sys.exit(2)
  for opt, arg in opts:
    if opt == '-h':
      print('books-toc-creator.py -l <language>')
      sys.exit()
    elif opt in ("-l", "--language"):
      languages = arg.split(',')

  for language in languages:

    with open('./content/{0}/books/handbook/chapters-order.adoc'.format(language), 'r', encoding = 'utf-8') as chaptersFile:
      chapters = [line.strip() for line in chaptersFile]

    toc =  "// Code @" + "generated by the FreeBSD Documentation toolchain. DO NOT EDIT.\n"
    toc += "// Please don't change this file manually but run `make` to update it.\n"
    toc += "// For more information, please read the FreeBSD Documentation Project Primer\n\n"
    toc += "[.toc]\n"
    toc += "--\n"
    toc += '[.toc-title]\n'
    toc += setTOCTitle(language) + '\n\n'

    chapterCounter = 1
    subChapterCounter = 1
    partCounter = 1
    for chapter in chapters:
      with open('./content/{0}/books/handbook/{1}'.format(language, chapter), 'r', encoding = 'utf-8') as chapterFile:
        chapterContent = chapterFile.read().splitlines()
        chapterFile.close()
        chapter = chapter.replace("/_index.adoc", "").replace(".adoc", "")

        if checkIsPart(chapter):
          for lineNumber, chapterLine in enumerate(chapterContent, 1):

            if re.match(r"^={1} [^!<\n]+", chapterLine):
              toc += "* link:{0}[{1} {2}. {3}]\n".format(chapter, setPartTitle(language), getPartNumber(partCounter), chapterLine.replace("=", "").strip())
          partCounter += 1

        elif checkIsPreface(chapterContent):
          for lineNumber, chapterLine in enumerate(chapterContent, 1):

            if re.match(r"^={1} [^!<\n]+", chapterLine):
              toc += "* link:{0}[{1}]\n".format(chapter, chapterLine.replace("=", "").strip())

        elif checkIsAppendix(chapterContent):
          for lineNumber, chapterLine in enumerate(chapterContent, 1):

            if re.match(r"^={1} [^!<\n]+", chapterLine):
              toc += "** link:{0}[{1} {2}]\n".format(chapter, setAppendixTitle(language), chapterLine.replace("=", "").strip())

            elif re.match(r"^={2} [^\n]+", chapterLine):
              toc += "*** link:{0}/#{1}[{2}]\n".format(chapter, chapterContent[lineNumber-2].replace("[[", "").replace("]]", ""), chapterLine.replace("==", "").lstrip())

        else: # Normal chapter
          for lineNumber, chapterLine in enumerate(chapterContent, 1):

            if re.match(r"^={1} [^!<\n]+", chapterLine):
              toc += "** link:{0}[{1} {2}. {3}]\n".format(chapter, setChapterTitle(language), chapterCounter, chapterLine.replace("=", "").strip())

            elif re.match(r"^={2} [^\n]+", chapterLine):
              toc += "*** link:{0}/#{1}[{2}.{3}. {4}]\n".format(chapter, chapterContent[lineNumber-2].replace("[[", "").replace("]]", ""), chapterCounter, subChapterCounter, chapterLine.replace("==", "").lstrip())
              subChapterCounter += 1

          chapterCounter += 1
          subChapterCounter = 1 # Reset subChapterCounter

    toc += "--\n"

    with open('./content/{0}/books/handbook/toc.adoc'.format(language), 'w', encoding = 'utf-8') as tocFile:
      tocFile.write(toc)

if __name__ == "__main__":
  main(sys.argv[1:])