// librairie de gestion des répertoires et fichiers
const fs = require('fs')
const path = require('path')

// librairie de gestion des arguments de la ligne de commande
var argv = require('optimist').argv

// librairie de traitement du pinyin
const pinyinizer = require('pinyinizer')
// librairie de gestion du hanzi
const opencc = require('node-opencc')
// librairie de gestion des fichiers xml
const builder = require('xmlbuilder')

// librairie de gestion des fichiers csv
var csv = require('comma-separated-values')

// données de stockage
var fichierXml = 'hsk16-table.xml'
var fichierJson = 'hsk16-table.json'
var fichierCSV = 'hsk16-table.csv'

// en entrée, on donne le nom du fichier à traiter sans le répertoire
var repertoireInitial = './'
var argument = argv._[0]

fichierDonnées = path.join(repertoireInitial, argument)
// DEBUG
// console.log(fichierDonnées);

// utilitaires
var tab = '\t'
var endLine = '\n'

// Variables fichier des fichiers csv, json et xml
fichierXml = path.join(repertoireInitial, argument + '.xml')
fichierJson = path.join(repertoireInitial, argument + '.json')
fichierCSV = path.join(repertoireInitial, argument + '-1.csv')

// on crée le fichier xml
var feed = builder.create('hsk16table', {
  version: '1.0',
  encoding: 'UTF-8',
  standalone: true
})

// on crée le fichier csv
var moncsv = fs.createWriteStream(fichierCSV)

// on crée le fichier json

var json = fs.createWriteStream(fichierJson)
json.write('{"hsk16":[')

var fichierATraiter = fs.readFileSync(fichierDonnées, 'UTF-8')

// DEBUG
// console.log(fichierATraiter);

var monjson = new csv(fichierATraiter, {
  header: [
    'frequence',
    'hanzi',
    'freq1',
    'freq2',
    'pinyin',
    'translation'
  ]
}).parse()

var nouveau = {
  hanzi: "",
  traditional: " ",
  pinyin: "",
  translation: "",
  classifier: "",
  lesson: "",
  sound: "",
  origin: "",
  frequence: ""
} 


// la ligne CSV qu'on va écrire dans le fichier CSV
var ligneCSV = ''
// L'élément xml qui constitue un enregistrement du fichier xml
var ele = null

monjson.forEach(function (enregistrement) {
  // DEBUG
  // console.log(enregistrement.hanzi);

  ligneCSV = ''
  ele = null

  try {
    // récupération des données du fichier original
    nouveau.hanzi = enregistrement.hanzi;
    nouveau.pinyin = enregistrement.pinyin;
    nouveau.frequence = enregistrement.frequence;
    nouveau.translation = enregistrement.translation;

    // console.log(JSON.stringify(enregistrement));

    // on traite le chinois traditionel
    nouveau.traditional = opencc.simplifiedToTraditional(
      nouveau.hanzi
    );

    // traitement des champs pinyin avec des chiffres
    nouveau.pinyin = nouveau.pinyin.toLowerCase();
    // on va tester ça ...
    try {
        var sauve = nouveau.pinyin;
        nouveau.pinyin = pinyinizer.pinyinize(nouveau.pinyin);
        nouveau.pinyin = nouveau.pinyin.replace(/5/g, "");
    } catch (err) {
        console.log("Erreur: " + pinyin);
        nouveau.pinyin = sauve;
    }

    // traitement du classifier
    if (nouveau.classifier == '') {
      nouveau.classifier = ''
    }
    // console.log(enregistrement.translation);
    // traitement du champ origin
    nouveau.origin = "http://lingua.mtsu.edu Jun Da";

    // traitement du champ grammartype
    nouveau.grammartype = "";
    // traitement du champ lesson
    nouveau.lesson = "";
    // traitement du champ sound
    nouveau.sound = "[sound:##]";


    ligneCSV =
      nouveau.hanzi +
      tab +
      nouveau.traditional +
      tab +
      nouveau.pinyin +
      tab +
      nouveau.translation +
      tab +
      nouveau.grammartype +
      tab +
      nouveau.classifier +
      tab +
      nouveau.lesson +
      tab +
      nouveau.sound +
      tab +
      nouveau.origin +
      endLine
    // DEBUG 
    // console.log(ligneCSV);
    // Ecriture de la ligne CSV
    moncsv.write(ligneCSV)
    // Ecriture de la ligne json
    json.write(JSON.stringify(nouveau) + ',')

    var ele = feed.ele({ nouveau })
  } catch (err) {
    console.log(err)
  }
})

// DEBUG
// console.log(monjson);

// Fermeture des fichiers json, xml et csv
// on ferme le fichier CSV
moncsv.end()

// on écrit le fichier xml
fs.writeFileSync(
  fichierXml,
  feed.end({
    pretty: true
  })
)

json.write('{},]}')
json.end()
