#!/usr/bin/env node
/**
 * @description A executable to be able to compile eggc lang files
 * @author Esther M. Quintero <alu0101434780@ull.edu.es>
 * @since 12/03/2024
 */

"use strict";

const fs = require("fs");
const { program } = require("commander");
const { parseFromFile } = require("../index.js");

const { version } = require("../package.json");

/**
 * A function that compiles a eggc file
 * @param {string} origin The name of the origin file
 * @param {string} destination The name of the destination file
 * @throws Will throw if there are errors in the program or if the files
 *         can't be opened
 */
const compile = (origin, options) => {
  console.log("---> Origin: ", origin);
  let destination = options.out;
  if (destination == undefined) {
    destination = options.out = origin.match(/^[^.]*/)[0] + ".json";
  }

  console.log("---> Destination: ", destination);
  // console.log(parseFromFile(origin));  
  const ast = parseFromFile(origin);
  // console.log("---> Ast: ", ast);

  if (options.run) {
    const { runFromEVM } = require("@crguezl/eloquentjsegg/lib/eggvm.js");
    runFromEVM(options.out);
  }

  const astString = JSON.stringify(ast, null, 2); 

  // console.log(astString);

  fs.writeFileSync(destination, astString);
  
};

program 
  .version(version)
  .description("A compiler for the eggc language")
  .usage("[options] <file>")
  .argument('<origin>', 'The path of the file to compile')
  .option(
    '-o, --out <destination>', 'The path of the file to write the output to'
  )
  .option(
    '-r, --run', 'Run the program after compiling it'
  )
  .action((origin, options) => {
    try {
      compile(origin, options);
    } catch (error) {
      console.error('There was an error: ' + error.message);
      process.exit(1);
    }
  });

program.parse(process.argv);