/************************************************************************************/
//import WFRP_Tables from "/systems/wfrp4e/modules/system/tables-wfrp4e.js";
import { WH4FRPatchConfig } from "./config-patch.js";
//import { TranslatedCompendium } from "../../babele/script/translated-compendium.js";

/************************************************************************************/
const _patch_eis = () => {
  if (game.wfrp4e?.config?.symptoms && game.wfrp4e.config.symptoms["delirium"]) {
    game.wfrp4e.config.symptoms["delirium"] = "Delirium";

    game.wfrp4e.config.symptomDescriptions["delirium"] = "Euer Bewusstsein kommt und geht, mit Momenten der Klarheit, die plötzlich von Anfällen von Delirium, Halluzinationen und Angstzuständen abgelöst werden. Macht jede Stunde einen <b>Willenskrafttest (Herausfordernd, +0)</b> und konsultiert die Tabelle <b><a class='table-click' data-table='delirium'>Delirien</a></b>.";

    game.wfrp4e.config.symptomTreatment["delirium"] = "Einige Heiler behandeln Delirium wie ein Fieber, mit ähnlichen Maßnahmen. Die Medikamente kosten von ein paar Schilling bis hin zu einigen Kronen, sind jedoch nur in 10% der Fälle wirksam.<br><br>Bei korrekter Pflege kann ein erfolgreicher <b>Heilkunde-Test (Herausfordernd, +0)</b> die Halluzinationen für <b><a class = 'chat-roll'>1d10</a></b> Stunden stoppen.<br><br>Es ist auch üblich, delirierende Patienten mit Beruhigungsmitteln wie Mondblume oder sogar Alraunenwurzel zu behandeln, um sie während einer Krise ruhig zu halten. Diese Mittel versetzen sie in einen unruhigen Schlaf, bis sie sich erholen oder sterben.";

    game.wfrp4e.config.symptoms["swelling"] = "Schwellung";

    game.wfrp4e.config.symptomDescriptions["swelling"] = "Ein Körperteil schwillt auf ein Vielfaches seiner normalen Größe an, wird rot oder violett und fast unbrauchbar. Der betroffene Bereich entspricht normalerweise einer Wunde oder einem Biss, der die Schwellung verursacht hat, oder der Stelle, an der eine Krankheit oder Infektion in den Körper eingedrungen ist.<br><br><b>Kopf</b>: Die Augen und die Zunge schwellen an, die Wangen verfärben sich dunkel, und der Kiefer bleibt offen. Essen ist unmöglich, aber leichte Flüssigkeiten können in kleinen Mengen getrunken werden. Alle Tests, die Sprechen erfordern, sind um 3 Stufen erschwert.<br><b>Arm</b>: Der Arm und die Hand schwellen an, die Gelenke von Schulter und Ellenbogen können nicht mehr bewegt werden, und die Hand ist unbrauchbar. Für die Dauer der Schwellung gilt der Arm als amputiert.<br><b>Körper</b>: Der ganze Körper schwillt an, sodass der Betroffene keine Kleidung mehr tragen kann. Alle Tests, die Bewegung erfordern, sind um 3 Stufen erschwert.<br><b>Bein</b>: Das Bein schwillt grotesk an, wird auf seiner gesamten Länge so breit wie der dickste Teil des Oberschenkels, und der Fuß ist kaum noch erkennbar. Für die Dauer der Schwellung gilt das Bein als amputiert (WFRP, Seite 180).";

    game.wfrp4e.config.symptomTreatment["swelling"] = "Die meisten Behandlungen bestehen darin, den betroffenen Bereich oder manchmal den gesamten Körper in ein kaltes Wasserbad zu tauchen, um die mit der Schwellung einhergehende Hitze zu reduzieren. Ein <b>langer Heilkunde-Test (Schwierig, -20)</b> mit +3 SL reduziert die Schwellung um <b><a class ='chat-roll'>2d10</a></b> Stunden. Jeder Test dauert eine Stunde. Der Patient erhält den Zustand Erschöpft +1 für jeden Test, der während des Prozesses durchgeführt wird.<br><br>Alternativ können einige Ärzte den Patienten zur Ader lassen oder Blutegel verwenden. Ein erfolgreicher <b>langer Heilkunde-Test</b> mit +4 SL und den entsprechenden Werkzeugen (Arztausbildung) reduziert die Schwellung um (<a class ='chat-roll'>1d10</a> + Zähigkeitsbonus des Patienten) Stunden. Jeder Test hat eine Grundschwierigkeit von <b>unmöglich (-50)</b> und dauert eine halbe Stunde.";

    game.wfrp4e.config.loreEffects["tzeentch"] = {
      label: "Lehre des Tzeentch",
      icon: "modules/wfrp4e-core/icons/spells/tzeentch.png",
      transfer: true,
      flags: {
        wfrp4e: {
          "effectApplication": "apply",
          "effectTrigger": "oneTime",
          "lore": true,
          "script": `
             if (this.actor.isOwner)
                args.actor.setupSkill("Widerstand", {context : {failure: "1 Korrumpierungspunkt erhalten", success : "1 Glückspunkt erhalten"}}).then(setupData => {
                    args.actor.basicTest(setupData).then(test => 
                     {
                         if (test.result.result == "success" && args.actor.type == "character")
                         {
                             args.actor.update({"system.status.fortune.value" : args.actor.system.status.fortune.value + 1})
                         }
                         else if (test.result.result == "failure" && args.actor.type == "character")
                         {
                          args.actor.update({"system.status.corruption.value" : args.actor.system.status.corruption.value + 1})
                         }
                     })
                  })`
        }
      }
    }
  }
}

/************************************************************************************/
const _patch_up_in_arms = () => {

  game.wfrp4e.config.hitLocationTables["quadruped"] = "Vierbeinig";
  let batter = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Batter")
  if (batter) {
    batter.name = "Niederschlagen";
    batter.description = "Gegen einen erfahreneren Gegner kann rohe Gewalt manchmal dort erfolgreich sein, wo andere Ansätze scheitern.";
    batter.effect = "<strong>Spezialaktion</strong>: Um deinen Gegner niederzuschlagen, musst du einen Opposed Test auf Stärke gegen deinen Gegner bestehen. Der Charakter mit den meisten Erfolgsgraden (SL) gewinnt. Wenn du diesen Test gewinnst, erhält dein Gegner den Zustand @Condition[Am Boden] und du erhältst +1 Vorteil. Wenn du den Opposed Test verlierst, erhält dein Gegner +1 Vorteil und deine Aktion ist beendet. Du erhältst keinen zusätzlichen Vorteil für den Sieg in diesem Opposed Test (d.h. insgesamt nur 1 Vorteil, wenn der Opposed Test auf Stärke gewonnen wird)."
  }

  let trick = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Trick")
  if (trick) {
    trick.name = "Täuschen";
    trick.description = "Du nutzt einen Moment, um deinem Gegner Sand in die Augen zu werfen oder brennendes Öl auf ihn zu schleudern. Diese Taktik ist riskant, und nur wenige Gegner fallen zweimal auf denselben Trick herein.";
    trick.effect = "<strong>Spezialaktion</strong>: Um deinen Gegner zu täuschen, musst du einen Opposed Test auf Beweglichkeit gegen ihn bestehen. Der Charakter mit den meisten Erfolgsgraden (SL) gewinnt den Test. Wenn du diesen Test gewinnst, erhältst du +1 Vorteil. Abhängig von den Umständen kann der SL dir erlauben, deinem Gegner einen der folgenden Zustände zuzufügen: @Condition[Entflammt], @Condition[Geblendet] oder @Condition[Verheddert]. Wenn du den Opposed Test verlierst, erhält dein Gegner +1 Vorteil und deine Aktion ist beendet. Der SL kann bestimmte Zustände verbieten, wenn du keinen passenden Gegenstand in der Hand hast oder wenn du diesem Gegner denselben Zustand bereits zuvor zugefügt hast. Du erhältst keinen zusätzlichen Vorteil für den Sieg in diesem Opposed Test (d.h. insgesamt nur 1 Vorteil, wenn der Opposed Test auf Beweglichkeit gewonnen wird)."
  }

  let addeffort = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Additional Effort")
  if (addeffort) {
    addeffort.name = "Zusätzliche Anstrengung";
    addeffort.description = "In verzweifelten Situationen kannst du deinen gesammelten Schwung nutzen, um deine Erfolgschancen zu erhöhen.";
    addeffort.effect = "<strong>Freie Aktion</strong>: Du erhältst einen Bonus von +10 % auf einen beliebigen Test. Du kannst zusätzliche Vorteile ausgeben, um für jeden weiteren ausgegebenen Vorteil +10 % hinzuzufügen. Zum Beispiel kannst du 3 Vorteile für einen Bonus von +10 % ausgeben, 4 Vorteile für +30 % usw. Der daraus resultierende Test bringt dem Charakter, der ihn durchführt, niemals Vorteile ein."
  }
  let flee = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Flee from Harm")
  if (flee) {
    flee.name = "Dem Bösen Entkommen";
    flee.description = "Du nutzt einen Moment der Ablenkung deines Gegners, um dich aus dem Kampf zurückzuziehen.";
    flee.effect = "<strong>Bewegung</strong>: Du kannst dich von deinem Gegner entfernen, ohne eine Strafe zu erleiden. Dies ersetzt die Regel für @UUID[Compendium.wfrp4e-core.journal-entries.NS3YGlJQxwTggjRX.JournalEntryPage.bdfiyhEYtKs7irqc#disengaging]{Ausstieg}."
  }
  let addaction = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Additional Action")
  if (addaction) {
    addaction.name = "Zusätzliche Aktion";
    addaction.description = "Du nutzt eine Gelegenheit, um eine bemerkenswerte Handlung durchzuführen.";
    addaction.effect = "<strong>Freie Aktion</strong>: Du führst eine zusätzliche Aktion aus. Diese Aktion gewährt dir niemals einen Vorteil. Du kannst diese Ausgabe von Vorteilen nur einmal pro Runde durchführen."
  }
}

/************************************************************************************/
/* Manages /auberge command */
const _manage_inn_roll = async (content, msg) => {
  // Split input into arguments
  let command = content.split(" ").map(function (item) {
    return item.trim();
  })

  console.log("COMMANDES", command);
  if (command[0] == "/gasthaus" && command[1]) {
    msg["type"] = 0;
    msg["rollMode"] = "gmroll";
    var compendium = game.packs.get('wh4-de-translation.gerichte-gasthaeuser')
    const pack = game.packs.get(compendium);
    let rollList = await compendium.getDocuments()
    //console.log("AUBERGE", rollList)
    for (var i = 0; i < rollList.length; i++) {
      var rollTab = rollList[i];
      console.log("Got compendium...", rollList, rollTab.name);
      if (rollTab.name.toLowerCase().includes(command[1].toLowerCase())) {
        let my_rollTable;
        await compendium.getDocument(rollTab._id).then(mytab => my_rollTable = mytab);
        my_rollTable.draw({ rollMode: "gmroll" });
        return false;
      }
    }
  }
  if (content.includes("/gasthaus")) {
    msg["type"] = 0;
    msg["rollMode"] = "gmroll";
    msg["content"] = "Syntax : /gasthaus KEYWORD, mit KEYWORD unter:<br> BasisGetraenke, StarkeGetraenke, Desserts, AllgemeineGerichte, ExzellenteGerichte, MaritimeGerichte, MittelmaessigeGerichte, Qualitaetsgerichte, Flussgerichte. Verknüpfungen sind mit einem Teil des Namens möglich: Basis (entspricht BasisGetraenke) oder /gasthaus Mari (entspricht MaritimeGerichte) usw."
    ChatMessage.create(msg);
    return false;
  }
}

/************************************************************************************/
let __eis_tables = {
  "animalmishap": 1, "beasthead": 1, "coincedentalenc": 1, "demonic-mien": 1,
  "expandedmutatemental": 1, "expandedmutatephys": 1, "fixations": 1,
  "harmfulenc": 1, "positiveenc": 1, "weather": 1, "mutatephys": 1,
  "vehiclemishap": 1, "quadruped": 1, "ridingmishap": 1, "weather": 1,
  "delirium": 1
}
let __dotr_tables = {
  "rowingboat": 1, "sailingboat": 1, "wind-direction": 1, "waterborne": 1, "traderumour": 1
}
let __wfrp4e_tables = {
  "career": 1, "critbody": 1, "critleg": 1, "doom": 1, "doom2": 1, "eyes": 1, "majormis": 1, "mutatemental": 1, "oops": 1, "species": 1, "travel": 1,
  "hitloc": 1, "critarm": 1, "crithead": 1, "delirium": 1, "event": 1, "hair": 1, "minormis": 1, "mutatephys": 1, "talents": 1, "wrath": 1,
  "astral": 1, "corruption": 1, "snake": 1, "spider": 1, "job": 1

}
let __to_table_translate = [{ name: "traits", transl: "Eigenschaften" }, { name: "talents", transl: "Talente" }, { name: "skills", transl: "Fähigkeiten" },
{ name: "careers", transl: "Karrieren" }, { name: "spells", transl: "Zauber" }, { name: "prayers", transl: "Gebete und Wunder" },
{ name: "injuries", transl: "Verletzungen" }, { name: "criticals", transl: "Kritische Treffer" }, { name: "trappings", transl: "Ausrüstung" },
{ name: "bestiary", transl: "Bestiarium" }, { name: "diseases", transl: "Krankheiten" }
]

/************************************************************************************/
const __create_translation_tables = async (compmod) => {
  for (let iterData of __to_table_translate) {

    let entityName = compmod + '.' + iterData.name;
    let compData = game.packs.get(entityName);
    let compFull = await compData.getContent();
    let htmlTab = "<table border='1'><tbody>";
    for (let entryData of compFull) {
      htmlTab += "<tr><td>" + entryData.data.originalName + "</td><td>@Compendium[" + entityName + '.' + entryData.id + "]{" + entryData.name + "}</td></tr>\n";
    };
    htmlTab += "</table>";
    let myjournal = await JournalEntry.create({ name: 'Übersetzung von ' + iterData.transl, content: htmlTab });
    game.journal.insert(myjournal);
  }
}

/************************************************************************************
 * The default static compendium of translation tables must be aut-mapped to the relevant
 * compendium content name (ie either wfrp4e or wfrp4e-core up to now).
 *                                                                                     */
const __auto_patch_translation_journal_compendium = async (compmod) => {
  if (game.user.isGM) {
    let compData = game.packs.get("wh4-de-translation.tables-des-traductions");
    compData.locked = false;
    let translEntries = await compData.getContent();
    for (let entryData of translEntries) {
      let mydata = foundry.utils.duplicate(entryData.data);
      mydata.content = mydata.content.replace(/wfrp4e-content/g, compmod);
      entryData.update(mydata);
    }
    compData.locked = true;
  }
}

/************************************************************************************/
const loadCompendiumData = async (compendium) => {
  const pack = game.packs.get(compendium);
  return await pack?.getDocuments() ?? [];
}

/* -------------------------------------------- */
/************************************************************************************/
const loadCompendium = async (compendium, filter = item => true) => {
  let compendiumData = await loadCompendiumData(compendium);
  return compendiumData.filter(filter);
}

/************************************************************************************/
const patch_core_tables = (tableList) => {
  if (game.version) { // v9 and above
    return;
  }
  FilePicker.browse("data", "modules/wh4-de-translation/tables/").then(resp => {
    for (var file of resp.files) {
      let filename = file.substring(file.lastIndexOf("/") + 1, file.indexOf(".json"))
      if (tableList[filename] == 1) { // Matching table name -> patch !
        fetch(file).then(r => r.json()).then(records => {
          //console.log("Patch !!!", filename, records);
          //WFRP_Tables[filename] = records;
          game.wfrp4e.tables[filename] = records;
        });
      }
    }
  });
}

/************************************************************************************/
const patch_trade_gazeteer = () => {
  if (game.wfrp4e.config.trade?.gazetteer) {
    fetch("modules/wh4-de-translation/trade/gazetteer_dotr.json").then(r => r.json()).then(records => {
      game.wfrp4e.config.trade.gazetteer = records;
    });
  }
}

/************************************************************************************/
const __check_fix_wrong_modules = (chatFlag, patchFinished) => {

  WH4FRPatchConfig.perform_patch();

  let coreFound = false;
  game.modules.forEach((module, name) => {

    //console.log("TESTING MODULE", module)
    if (module.id == "wfrp4e-core" && module.active) {
      coreFound = true
      patch_core_tables(__wfrp4e_tables);
    }
    if (module.id == "wfrp4e-eis" && module.active) {
      patch_core_tables(__eis_tables);
      _patch_eis();
    }
    if (module.id == "wfrp4e-dotr" && module.active) {
      patch_core_tables(__dotr_tables);
      patch_trade_gazeteer()
    }

    if (module.id == "wfrp4e-up-in-arms" && module.active) {
      _patch_up_in_arms();
    }

    if (module.id == 'ogre-kingdom-wfrp4e' && module.active) {
      WH4FRPatchConfig.perform_ogrekingdom_patch();
      if (game.user.isGM && chatFlag)
        ChatMessage.create({ content: "<div><strong>Das Modul Ogre-Kingdom wurde entdeckt und automatisch gepatcht.</strong></div>", whisper: ChatMessage.getWhisperRecipients("GM") });
    }

    if (module.id == "wfrp4e-ew" && module.active && game.user.isGM && chatFlag) {
      ChatMessage.create({
        content: "<div><strong>Sie haben das EW-Modul (wfrp4e-ew?) installiert. Leider ist dieses Modul nicht mit Übersetzungen kompatibel und unterbricht die Funktionsweise der Übersetzungen. Bitte kopieren Sie die Kompendien in Ihre Welt zurück, deaktivieren Sie das Modul und starten Sie die Welt neu.</strong></div>",
        whisper: ChatMessage.getWhisperRecipients("GM")
      });
    }
  });
  if (!coreFound) {
    if (game.user.isGM && chatFlag) {
      ChatMessage.create({
        content: "<div><strong>Das Core-Modul WFRP4E wurde nicht gefunden oder aktiviert. Bitte kaufen und/oder aktivieren Sie dieses Core-Modul, bevor Sie fortfahren.</strong></div>",
        whisper: ChatMessage.getWhisperRecipients("GM")
      });
    }
  } else {
    if (game.user.isGM && patchFinished) {
      ChatMessage.create({
        content: "<div>Die WFRP4E-Module wurden <strong>erfolgreich</strong> übersetzt. Du kannst loslegen und <strong>möge Shallya dich behüten</strong></div>",
        user: game.user.id,
        whisper: ChatMessage.getWhisperRecipients("GM")
      });
    }
  }
}

const __history = [
  "Nouveautés 7.1.6: <ul><li>Traduction des acteurs de EiS et Middenheim grâce à Eltrys et Kyllian !</li></ul>"
]

/************************************************************************************/
const convertColumnToMulti = (table) => {
  let columns = table.columns;
  let newTable = foundry.utils.duplicate(table)

  delete newTable.columns;
  newTable.rows = table.rows.map(i => { return { range: {} } })
  newTable.multi = table.columns

  for (let column of columns) {
    for (let row of newTable.rows) {
      row[column] = {}
      row.range[column] = []
    }
  }

  for (let index in newTable.rows) {
    for (let column in table.rows[index].range) {
      newTable.rows[index][column] = { name: table.rows[index].name }
      newTable.rows[index].range[column] = table.rows[index].range[column]
    }
  }
  return newTable;
}

/************************************************************************************/
const __patchStyleSheet = () => {
  for (let styleSheet of document.styleSheets) {
    if (styleSheet.href && styleSheet.href.includes("wfrp4e.css")) {
      let found = 0
      for (let i = 0; i < styleSheet.cssRules.length; i++) {
        let rule = styleSheet.cssRules[i]
        if (rule.selectorText == '.sidebar-popout') {
          console.log("DELETE RULE", rule)
          found = i
          /*rule.cssText = ".sidebar-popout {  }"
          rule.style.width = ""
          console.log("Found rul2", rule)*/
        }
      }
      styleSheet.deleteRule(found)
    }
  }
}

/************************************************************************************/
const __add_actors_translation = () => {
  const lang = game.settings.get('core', 'language');
  if (lang == "de") {
    let pack_array = [];
    for (let metadata of game.packs) {
      if (!game.babele.isTranslated(metadata) &&
        metadata.collection != "wfrp4e-core.actors" &&
        metadata.collection != "wfrp4e-core.bestiary" &&
        metadata.collection != "wfrp4e-ua1.actors" &&
        metadata.collection != "wfrp4e-altdorf.actors" &&
        metadata.collection != "wfrp4e-rnhd.actors" &&
        metadata.collection != "wfrp4e-dotr.actors" &&
        metadata.collection != "wfrp4e-eis.actors" &&
        metadata.collection != "wfrp4e-pbtt.actors" &&
        metadata.collection != "wfrp4e-middenheim.actors" &&
        metadata.documentName === 'Actor') {
        //console.log("REPLACE PACK : ", metadata);
        let translations = {
          "label": metadata.name,
          "mapping": {
            "name": "name",
            "description": "system.details.biography.value",
            "items": {
              "path": "items",
              "converter": "bestiary_traits"
            },
            "characteristics": {
              "path": "system.characteristics",
              "converter": "npc_characteristics"
            },
            "details": {
              "path": "system.details",
              "converter": "npc_details"
            }
          }
        }
        //console.log(metadata, translations)
        //game.babele.packs.set(metadata.metadata.id, new TranslatedCompendium(metadata.metadata, translations))
      }
    }
  }
  // Close the warning dialog
  if (game.wfrp4e.warnDialog) {
    game.wfrp4e.warnDialog.close();
    game.wfrp4e.warnDialog = null;
  }
}


/************************************************************************************/
/* Hook for specific command */
Hooks.on("chatMessage", (html, content, msg) => {

  if (content.toLowerCase().includes('gasthaus')) {
    _manage_inn_roll(content, msg);
    return false;
  }
});

/************************************************************************************/
/* Additionnal hooks ready */
Hooks.on('ready', () => {

  if (game.user.isGM) {
    game.wfrp4e.warnDialog = new Dialog({
      title: "Übersetzung laden - Danke fürs Warten",
      content: `<img src="modules/wh4-de-translation/images/warhammer-v1-logo.webp"><p >
      Die Diener Sigmars der Risikogruppe bereiten zusammen mit den bretonischen Rattenfängern die Übersetzung dieser Welt vor...</h3> <p >Bitte warte , bis diese Nachricht verschwunden ist, bevor du dich im Reich bewegst.</p><p >Wenn ein Segen von Shallya im Chat erscheint, ist alles gut gelaufen.</p>
      <p style="font-size=smaller">Les moines de l'ordre de l'Enclume, associés aux légistes de Talabaheim, préparent la traduction Bretonnienne de ce monde...</p><p style="font-size=smaller">Merci d'attendre la disparition de ce message pour vaquer dans l'Empire.</p> <p style="font-size=smaller">Si une bénédiction de Shallya apparait dans le tchat, c'est que tout s'est bien passé.</p>`,
      buttons: {
      }
    })
    game.wfrp4e.warnDialog.render(true, { focus: true, left: 20, top: 20 });
    let chatData = {
      user: game.user.id,
      rollMode: game.settings.get("core", "rollMode"),
      whisper: ChatMessage.getWhisperRecipients('GM'),
      content: `<div>Die WFRP4E-Module werden <strong>für die Übersetzung gepatcht</strong>... Bitte <strong>warte auf die Abschlussnachricht</strong> (in ca. 20 Sekunden).<p>Zur Erinnerung: Aktiviere dieses deutsche Übersetzungsmodul <strong>vor</strong> dem Import der Daten aus den C7-Modulen (einschließlich des Core-Moduls). Mit anderen Worten: Aktiviere dieses deutsche Modul <strong>vor</strong> allen anderen Modulen.</p></div>`

    }
    ChatMessage.create(chatData);
  }

  // Patch function for effects
  game.wfrp4e.utility.findKey = warhammer.utility.findKey

  /** New modifiers */
  game.wfrp4e.config.difficultyModifiers = {
    "veasy": 60,
    "easy": 40,
    "banal": 30,
    "average": 20,
    "medium": 10,
    "challenging": 0,
    "difficult": -10,
    "hard": -20,
    "vhard": -30,
    "doom": -40
  }
  game.wfrp4e.config.difficultyLabels = {

    "veasy": "Sehr leicht (+60)",
    "easy": "Leicht (+40)",
    "banal": "Banal (+30)",
    "average": "Durchschnittlich (+20)",
    "medium": "Machbar (+10)",
    "challenging": "Herausfordernd (+0)",
    "difficult": "Schwierig (-10)",
    "hard": "Schwer (-20)",
    "vhard": "Sehr schwer (-30)",
    "doom": "Unmöglich (-40)"
  }

  game.wfrp4e.warnDialog.render(true, { focus: true, left: 20, top: 20 });
  //setTimeout( __check_fix_wrong_modules, 2000, true, false);
  setTimeout(__check_fix_wrong_modules, 20000, true, true);
  setTimeout(__add_actors_translation, 21000, false, true);

  //__patchStyleSheet()

  /* ATTEMPT !!
  loadCompendium("wfrp4e-core.spells").then( comp => {
    let sorted = {};
    for (let spell of comp) {
      if ( !sorted[spell.data.data.lore.value]) {
        sorted[spell.data.data.lore.value] = [];
      }
      sorted[spell.data.data.lore.value].push( foundry.utils.duplicate(spell.data) );
    }
    console.log("SORTED", sorted);
  });*/

  /*
  let compmod = "wfrp4e";
  // Check various settings in the installation  
  game.modules.forEach((module, name) => {
    if ( name == "wfrp4e-core" && module.active) {
      compmod = "wfrp4e-core";
    }
  } );
  __auto_patch_translation_journal_compendium( compmod )
  /* Uncomment this to auto-create the translation tables 
     Auto-create translation journal tables
  __create_translation_tables(compmod);
  */

});
