// 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 = "chinwa-table.xml";
var fichierJson = "chinwa-table.json";
var fichierCSV = "chinwa-table.csv";

// en entrée, on donne le nom du fichier à traiter sans le répertoire
var repertoireInitial = "/home/eric/Devs/Nodejs/Listes/Chinwa";
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('chinwatable', {
    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('{"chinwa1":[');


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

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

var monjson = new csv(fichierATraiter, {
    header: [
        'hanzi', 
        'traditional', 
        'pinyin', 
        'translation',
        'anglais',
        'classifier',
        'lesson',
        'sound',
        //'sound1',
        'origin'],
    cast: [
        'String', 
        'String',
        'String',
        'String',
        'String',
        'String',
        'String',
        'String',
        //'String',
        'String']
  }).parse();



// 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;
var l = 0;
monjson.forEach(function(enregistrement){
    // DEBUG
    // console.log(enregistrement.hanzi);

    ligneCSV = "";
    ele = null;
    l = l + 1;
    console.log("ligne: " , l);
    try {
        enregistrement.traditional = opencc.simplifiedToTraditional(enregistrement.hanzi).trim();
        // DEBUG
        //console.log(enregistrement.hanzi, "**", enregistrement.traditional);
        // console.log(enregistrement.translation);
        enregistrement.translation = enregistrement.translation.replace(/;/g, " /");
        enregistrement.translation = enregistrement.translation.replace(/, /g, " / ");
        enregistrement.anglais = enregistrement.anglais.replace(/;/g, " /");
        enregistrement.anglais = enregistrement.anglais.replace(/, /g, " / ");
        if (enregistrement.classifier == "") {
            enregistrement.classifier = "";
        }
        
        enregistrement.hanzi = enregistrement.hanzi.trim();
        enregistrement.pinyin = enregistrement.pinyin.trim();
        enregistrement.translation = enregistrement.translation.trim();
		enregistrement.lesson = "HSK3";
        if (enregistrement.hanzi.length == 1) {
            enregistrement.charcode = enregistrement.hanzi.charCodeAt(0);
          } else {
              enregistrement.charcode= 0;
          }

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

        var ele = feed.ele({enregistrement});
    } 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
}));

// on écrit le fichier Json
// fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8");
json.write('{},]}');
json.end();