import { Grammar } from "./grammar.js";
import { CompendiumTable, CompendiumTableHelpers, SystemCompendiums } from "./settings/system-compendiums.js";

export class RdDRollTables {

  /* -------------------------------------------- */
  static async genericGetTableResult(tableName, toChat) {
    let table = RdDRollTables.getWorldTable(tableName) ?? (await RdDRollTables.getSystemTable(tableName));
    const draw = await table.draw({ displayChat: toChat, rollMode: "gmroll" });
    return draw.results.length > 0 ? draw.results[0] : undefined;
  }

  static getWorldTable(tableName) {
    return game.tables.find(table => table.name.toLowerCase() == tableName.toLowerCase());
  }

  static async getSystemTable(tableName) {
    const pack = SystemCompendiums.getPack("tables-diverses");
    const index = await pack.getIndex();
    const entry = index.find(e => e.name === tableName);
    return await pack.getDocument(entry._id);
  }

  /* -------------------------------------------- */
  static async drawItemFromRollTable(tableName, toChat = false) {
    const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
    const pack = game.packs.get(drawResult.documentCollection)
    return await pack.getDocument(drawResult.documentId)
  }

  /* -------------------------------------------- */
  static async drawTextFromRollTable(tableName, toChat) {
    const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
    return drawResult.text;
  }

  /* -------------------------------------------- */
  static async getCompetence(toChat = false) {
    if (toChat == 'liste') {
      return await RdDRollTables.listOrRoll('competences', 'Item', ['competence'], toChat, it => 1);
    }
    else {
      return await RdDRollTables.drawItemFromRollTable("Détermination aléatoire de compétence", toChat);
    }
  }

  /* -------------------------------------------- */
  static async getSouffle(toChat = false) {
    return await RdDRollTables.listOrRoll('souffles-de-dragon', 'Item', ['souffle'], toChat);
  }

  /* -------------------------------------------- */
  static async getQueue(toChat = false) {
    return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat);
  }

  static async getDesirLancinant(toChat = false) {
    return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat,
      it => it.system.frequence,
      it => it.system.categorie == 'lancinant');
  }

  static async getIdeeFixe(toChat = false) {
    return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat,
      it => it.system.frequence,
      it => it.system.categorie == 'ideefixe');
  }

  /* -------------------------------------------- */
  static async getTeteHR(toChat = false) {
    return await RdDRollTables.listOrRoll('tetes-de-dragon-pour-haut-revants', 'Item', ['tete'], toChat);
  }

  /* -------------------------------------------- */
  static async getTete(toChat = false) {
    return await RdDRollTables.listOrRoll('tetes-de-dragon-pour-tous-personnages', 'Item', ['tete'], toChat);
  }

  /* -------------------------------------------- */
  static async getOmbre(toChat = false) {
    return await RdDRollTables.listOrRoll('ombres-de-thanatos', 'Item', ['ombre'], toChat);
  }

  /* -------------------------------------------- */
  static async getTarot(toChat = true) {
    return await RdDRollTables.listOrRoll('tarot-draconique', 'Item', ['tarot'], toChat);
  }

  /* -------------------------------------------- */
  static async listOrRoll(compendium, type, subTypes, toChat, itemFrequence = it => it.system.frequence, filter = it => true) {
    const table = new CompendiumTable(compendium, type, subTypes);
    if (toChat == 'liste') {
      return await table.toChatMessage(itemFrequence, filter);
    }
    const row = await table.getRandom(itemFrequence, filter);
    if (row) {
      await CompendiumTableHelpers.tableRowToChatMessage(row, type);
      return row.document;
    }
    return undefined;
  }

  /* -------------------------------------------- */
  static async getMaladresse(options = { toChat: false, arme: false }) {
    return await RdDRollTables.drawTextFromRollTable(
      options.arme ? "Maladresse armé" : "Maladresses non armé",
      options.toChat);
  }

}
