import * as fs from "fs";
import * as path from "path";
import { tmpdir } from "os";
import app from "./styleTree/app";
import themes, { internalThemes, experimentalThemes } from "./themes";
import snakeCase from "./utils/snakeCase";
import Theme from "./themes/common/theme";

const themeDirectory = `${__dirname}/../../assets/themes`;
const internalDirectory = `${themeDirectory}/internal`;
const experimentsDirectory = `${themeDirectory}/experiments`;
const tempDirectory = fs.mkdtempSync(path.join(tmpdir(), "build-themes"));

// Clear existing themes
function clearThemes(themeDirectory: string) {
  for (const file of fs.readdirSync(themeDirectory)) {
    if (file.endsWith(".json")) {
      const name = file.replace(/\.json$/, "");
      if (!themes.find((theme) => theme.name === name)) {
        fs.unlinkSync(path.join(themeDirectory, file));
      }
    }
  }
}

clearThemes(themeDirectory);
clearThemes(internalDirectory);
clearThemes(experimentsDirectory);

function writeThemes(themes: Theme[], outputDirectory: string) {
  for (let theme of themes) {
    let styleTree = snakeCase(app(theme));
    let styleTreeJSON = JSON.stringify(styleTree, null, 2);
    let tempPath = path.join(tempDirectory, `${theme.name}.json`);
    let outPath = path.join(outputDirectory, `${theme.name}.json`);
    fs.writeFileSync(tempPath, styleTreeJSON);
    fs.renameSync(tempPath, outPath);
    console.log(`- ${outPath} created`);
  }
}

// Write new themes to theme directory
writeThemes(themes, themeDirectory);
writeThemes(internalThemes, internalDirectory);
writeThemes(experimentalThemes, experimentsDirectory);
