import { extractPack, compilePack } from '@foundryvtt/foundryvtt-cli';
import { promises as fs } from 'fs';
import path from "path";

const MODULE_ID = process.cwd();

export class CompendiumsManager {

  static async packToDistDir(srcDir = 'packs_src', distDir = 'packs', mode = 'yaml') {
    const yaml = mode === 'yaml'
    const packs = await fs.readdir('./' + srcDir);
    for (const pack of packs) {
      if (pack === '.gitattributes') continue;
      console.log('Packing ' + pack);
      await compilePack(
        `${MODULE_ID}/${srcDir}/${pack}`,
        `${MODULE_ID}/${distDir}/${pack}`,
        { yaml }
      );
    }
  }

  static async unpackToSrcDir(srcDir = 'packs_src', distDir = 'packs', mode = 'yaml') {
    const yaml = mode === 'yaml'
    const packs = await fs.readdir("./" + distDir);
    for (const pack of packs) {
      if (pack === ".gitattributes") continue;
      if (pack === ".directory") continue;
      if (pack.endsWith(".db")) continue;
      console.log("Unpacking " + pack);
      const directory = `./${srcDir}/${pack}`;
      // Create the directory if it doesn't exist
      await fs.mkdir(directory, { recursive: true });
      try {
        for (const file of await fs.readdir(directory)) {
          await fs.unlink(path.join(directory, file));
        }
      } catch (error) {
        if (error.code === "ENOENT") console.log("No files inside of " + pack);
        else console.log(error);
      }
      await extractPack(
        `${MODULE_ID}/${distDir}/${pack}`,
        `${MODULE_ID}/${srcDir}/${pack}`,
        {
          yaml: mode === 'yaml',
          transformName: doc => CompendiumsManager.transformName(doc, mode === 'yaml'),
        }
      );
    }
  }

  /**
   * Prefaces the document with its type
   * @param {object} doc - The document data
   */
  static transformName(doc, yaml) {
    const safeFileName = doc.name.replace(/[^a-zA-Z0-9А-я]/g, "_");
    const type = doc._key.split("!")[1];
    const prefix = ["actors", "items"].includes(type) ? doc.type : type;

    return `${doc.name ? `${prefix}_${safeFileName}_${doc._id}` : doc._id}.${yaml ? "yml" : "json"}`;
  }
}