#!/usr/bin/env node

const fs = require('fs');
const path = require('path');

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function getType(value) {
  if (Array.isArray(value)) {
    if (value.length === 0) {
      return 'any[]';
    } else {
      return `${getType(value[0])}[]`;
    }
  } else if (typeof value === 'object') {
    if (value === null) {
      return 'any';
    } else {
      return generateInterface(value);
    }
  } else {
    return typeof value;
  }
}

function generateInterface(jsonObject) {
  // console.log("---------------------------");
  // console.log(jsonObject);

  let properties = '';

  for (const key in jsonObject) {
    if (jsonObject.hasOwnProperty(key)) {
      const attribute = (key.indexOf('-') > 0 ? `"${key}"` : key);
      properties += `  ${attribute}: ${getType(jsonObject[key])};\n`;
    }
  }

  return `{\n${properties}}`;
}

function generateTypeScriptClassFromJson(jsonFilePath, tsOutputPath, newNameState) {
  const jsonContent = JSON.parse(fs.readFileSync(jsonFilePath, 'utf8'));
  const className = capitalizeFirstLetter(path.basename(jsonFilePath, '.json'));
  let tsContent = `
  import IWDWidgetBaseState from "${prefixLib}/WDWidgetBase/IWDWidgetBaseState";
  
  export default interface I${className}${newNameState} extends IWDWidgetBaseState ${generateInterface(jsonContent)};
  `;

  fs.writeFileSync(tsOutputPath, tsContent);
}

// Percorsi di input e output
// const jsonFilePath = './src/config/Configuration.json'; // Aggiorna con il percorso effettivo
// const tsOutputPath = './src/config/IConfiguration.ts'; // Aggiorna con il percorso effettivo

// Eseguiamo la funzione principale
// generateTypeScriptClassFromJson(jsonFilePath, tsOutputPath);
// console.log('Classe TypeScript generata con successo!');

const directoryPath = path.join(process.cwd(), "./src"); // Modifica con il percorso della tua cartella
let prefixLib = "@widgets";
if (!directoryPath.includes("/wreactwidgets/")) {
  prefixLib = "wreactwidgets/src/widgets";
}


const findAllJsonFiles = (dir) => {
    fs.readdir(dir, { withFileTypes: true }, (err, files) => {
        if (err) {
            console.error('Errore durante la lettura della directory:', err);
            return;
        }

        files.forEach(file => {
            const fullPath = path.join(dir, file.name);

            if (file.isDirectory()) {
                findAllJsonFiles(fullPath);
            } else if (path.extname(file.name).toLowerCase() === '.json') {
              // console.log("Percorso originale:", fullPath);

              // Determina se il percorso contiene una cartella "config"
              const containsConfig = fullPath.includes('/config/');

              // Creazione del nuovo percorso con modifiche
              let newName;
              let newNameState;
              newName = 'I' + file.name.substring(0, file.name.length - 5) + '.ts';
              newNameState = '';
              const modifiedPath = path.join(dir, newName);
              // console.log("Percorso modificato:", modifiedPath);
              console.log(`Converto ${fullPath} -> ${modifiedPath}`);
              generateTypeScriptClassFromJson(fullPath, modifiedPath, newNameState);
            }
        });
    });
};

findAllJsonFiles(directoryPath);
console.log('Classe TypeScript generata con successo!');