const replace = require('replace-in-file');

const fs = require('fs')

const CWD = process.cwd()
const siteConfig = require(`${CWD}/siteConfig.js`);
const docsDir = `${CWD}/build/${siteConfig.projectName}/docs`

function getVersions() {
    try {
      return JSON.parse(require('fs').readFileSync(`${CWD}/versions.json`, 'utf8'));
    } catch (error) {
      //console.error(error)
      console.error('no versions found defaulting to 0.20.0')
    }
    return ['0.20.0']
  }

function doReplace(options) {
replace(options)
    .then(changes => {
    if (options.dry) {
        console.log('Modified files:');
        console.log(changes.join('\n'))
    }
    })
    .catch(error => {
    console.error('Error occurred:', error);
    });
}


const versions = getVersions();

const latestVersion = versions[0];

const bazelVersions = {
    '0.20.0': '0.14.1',
    '0.20.1': '0.26',
    'latest': '0.26',
}

function replaceBazel(version) {
    try {
        if (version in bazelVersions) {
            return bazelVersions[version]
        } else {
            throw new Error('Unable to find bazel Version');
        }
    } catch (error) {

        console.error('no versions found defaulting to 0.26')
    }
    return '0.26'
}

console.log(latestVersion)
const from = [
    /{{heron:version}}/g,
    /{{bazel:version}}/g,
    /{{% heronVersion %}}/g,
    /{{% bazelVersion %}}/g
];

const options = {
    files: [
      `${docsDir}/*.html`,
      `${docsDir}/**/*.html`
    ],
    ignore: versions.map(v => `${docsDir}/${v}/**/*`), // TODO add next and assets
    from: from,
    to: [
        `${latestVersion}`,
        replaceBazel(`${latestVersion}`),
        `${latestVersion}`,
        replaceBazel(`${latestVersion}`),
    ],
    dry: false
  };
  
doReplace(options);

// replaces versions
for (v of versions) {
    if (v === latestVersion) {
      continue
    }
    const opts = {
      files: [
        `${docsDir}/${v}/*.html`,
        `${docsDir}/${v}/**/*.html`
      ],
      from: from,
      to: [
          `${v}`,
          replaceBazel(`${v}`),
          `${v}`,
          replaceBazel(`${v}`),
      ],
        dry: false
    };
    doReplace(opts);
}  