package main;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.swing.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
public class ImportJSON extends Application {
    //Quelldateien
//    private File sourceWorldJSON = new File("D:\\Gamez\\STEAM\\steamapps\\common\\Gems of War\\res\\Data\\World.json");
//    private File sourceWorldXML = new File("D:\\Gamez\\STEAM\\steamapps\\common\\Gems of War\\res\\Text\\en_US\\World.xml");
//    private File sourceCommonXML = new File("D:\\Gamez\\STEAM\\steamapps\\common\\Gems of War\\res\\Text\\en_US\\Common.xml");
    private File sourceWorldJSON = new File("World.json");
    private File sourceWorldXML = new File("World.xml");
    private File sourceCommonXML = new File("Common.xml");
    private Document documentWorldXML = null, documentCommonXML = null;
    private File saveAs = null;
    //Elemente
    private Button btnStart;
    private Label lblCheckFiles = new Label("Dateiprüfung:"), lblCheckJWorldSON = new Label("check"), lblCheckWorldXML = new Label("check"), lblCheckCommonXML = new Label("check");
    private TextArea txtImport = new TextArea();
    //JSONObject mit komplettem Inhalt der World.json
    private static JSONObject jsonFull, jsonData;
    private static ObservableList<String> listTypes = FXCollections.observableArrayList();
    //JSONArrays mit originalen Daten
    private static JSONArray arrayHeroClassesOriginal, arrayKingdomsOriginal, arrayTraitsOriginal, arrayTroopsOriginal, arraySpellsOriginal, arrayWeaponsOriginal;
    @Override
    public void start(Stage primaryStage) throws Exception{
        //Oberfläche erzeugen
        lblCheckFiles.setFont(Font.font("Arial", FontWeight.BOLD, 15));
        lblCheckFiles.setPadding(new Insets(0,0,10,0));
        GridPane gridLabels = new GridPane();
        gridLabels.setHgap(10);
        gridLabels.setVgap(5);
        gridLabels.setPadding(new Insets(10,0,10,20));
        gridLabels.add(lblCheckFiles,0,0,2,1);
        gridLabels.add(new Label("World.json: "),0,1);
        gridLabels.add(lblCheckJWorldSON,1,1);
        gridLabels.add(new Label("World.xml: "),0,2);
        gridLabels.add(lblCheckWorldXML,1,2);
        gridLabels.add(new Label("Common.xml: "),0,3);
        gridLabels.add(lblCheckCommonXML,1,3);
        txtImport.setPrefWidth(600);
        txtImport.setPrefHeight(500);
        VBox boxTextArea = new VBox(txtImport);
        boxTextArea.setPadding(new Insets(10));
        btnStart = new Button("Start");
        btnStart.setPrefHeight(40);
        btnStart.setPrefWidth(100);
        Button btnClose = new Button("Schließen");
        btnClose.setPrefHeight(40);
        btnClose.setPrefWidth(100);
        HBox boxButtons = new HBox(btnStart, btnClose);
        boxButtons.setAlignment(Pos.CENTER_RIGHT);
        boxButtons.setPadding(new Insets(10));
        boxButtons.setSpacing(20);
        VBox root = new VBox(gridLabels, boxTextArea, boxButtons);
        primaryStage.setTitle("Data Import");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
        //World.json auf Existenz prüfen
        if(sourceWorldJSON.exists()) {
            lblCheckJWorldSON.setText("Datei gefunden!");
        } else {
            lblCheckJWorldSON.setText("FEHLER: Datei nicht gefunden!");
            btnStart.setDisable(true);
        }
        //World.xml auf Existenz prüfen
        if(sourceWorldXML.exists()) {
            lblCheckWorldXML.setText("Datei gefunden!");
        } else {
            lblCheckWorldXML.setText("FEHLER: Datei nicht gefunden!");
            btnStart.setDisable(true);
        }
        //Common.xml auf Existenz prüfen
        if(sourceCommonXML.exists()) {
            lblCheckCommonXML.setText("Datei gefunden!");
        } else {
            lblCheckCommonXML.setText("FEHLER: Datei nicht gefunden!");
            btnStart.setDisable(true);
        }
        //FileChooser für Pfad der neuen Datei
        FileChooser fileChooser = new FileChooser();
        fileChooser.setInitialFileName("Data.json");
        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("JSON", "*.json"));
        //Button Actions
        btnStart.setOnAction(event -> {
            btnStart.setDisable(true);
            saveAs = fileChooser.showSaveDialog(primaryStage);
            importData();
        });
        btnClose.setOnAction(event -> System.exit(0));
    }
    private void importData() {
        System.out.println("Speicherort --> "+saveAs.getAbsolutePath()+"\n");
        //XML Dateien umwandeln ("&" in "&" wandeln)
        txtImport.appendText("Temporäre XML Dateien erzeugen\n");
        File tempWorldXML = createTempXML(sourceWorldXML);
        documentWorldXML = convertXML(tempWorldXML);
        File tempCommonXML = createTempXML(sourceCommonXML);
        documentCommonXML = convertXML(tempCommonXML);
        //JSON Daten verarbeiten
        try {
            txtImport.appendText("JSON Quelldatei einlesen und JSONObject erstellen\n");
            FileReader fileReader = new FileReader(sourceWorldJSON);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            String fileContent = bufferedReader.readLine();
            bufferedReader.close();
            jsonFull = new JSONObject(fileContent);
            //Arrays aus bestehender JSON erstellen
            arrayHeroClassesOriginal = jsonFull.getJSONArray("HeroClasses");
            arrayKingdomsOriginal = jsonFull.getJSONArray("Kingdoms");
            arrayTraitsOriginal = jsonFull.getJSONArray("Traits");
            arrayTroopsOriginal = jsonFull.getJSONArray("Troops");
            arraySpellsOriginal = jsonFull.getJSONArray("Spells");
            arrayWeaponsOriginal = jsonFull.getJSONArray("Weapons");
            //Neue Arrays mit benötigten Daten füllen
            JSONObject newHeroClasses = createHeroClasses(arrayHeroClassesOriginal);
            JSONObject newKingdoms = createKingdoms(arrayKingdomsOriginal);
            JSONObject newTraits = createTraits(arrayTraitsOriginal);
            JSONObject newTroops = createTroops(arrayTroopsOriginal);
            JSONObject newSpells = createSpells(arraySpellsOriginal);
            JSONObject newWeapons = createWeapons(arrayWeaponsOriginal);
            //Object für ManaBonus erzeugen
            JSONObject manaBonus = new JSONObject();
            for(int colorNr=0; colorNr<=5; colorNr++) {
                String colorName="", searchBonus, searchDescription;
                switch(colorNr) {
                    case 0:
                        colorName = "Blue";
                        break;
                    case 1:
                        colorName = "Green";
                        break;
                    case 2:
                        colorName = "Red";
                        break;
                    case 3:
                        colorName = "Yellow";
                        break;
                    case 4:
                        colorName = "Purple";
                        break;
                    case 5:
                        colorName = "Brown";
                        break;
                }
                searchBonus = "[BONUS_COLOR_"+colorNr+"]";
                searchDescription = "[BONUS_COLOR_DESCRIPTION_"+colorNr+"]";
                manaBonus.put("Bonus"+colorName, findXMLContent(searchBonus, documentCommonXML));
                manaBonus.put("Bonus"+colorName+"Description", findXMLContent(searchDescription, documentCommonXML));
            }
            //Object für TypeBonus erzeugen
            JSONObject typeBonus = new JSONObject();
            for(String type : listTypes) {
                String typeUC = type.toUpperCase();
                String searchBonus, searchDescription;
                for(int a=3; a<=4; a++) {
                    searchBonus = "[BONUS_TROOPTYPE_"+typeUC+"_"+a+"]";
                    searchDescription ="[BONUS_TROOPTYPE_DESCRIPTION_"+typeUC+"_"+a+"]";
                    typeBonus.put(type+"_"+a, findXMLContent(searchBonus, documentCommonXML));
                    typeBonus.put(type+"_"+a+"_"+"Description", findXMLContent(searchDescription, documentCommonXML));
                }
            }
            //Neues Object für alle gesammelten Daten erstellen
            jsonData = new JSONObject();
            jsonData.put("HeroClasses", newHeroClasses);
            jsonData.put("Kingdoms", newKingdoms);
            jsonData.put("Traits", newTraits);
            jsonData.put("Troops", newTroops);
            jsonData.put("Spells", newSpells);
            jsonData.put("Weapons", newWeapons);
            jsonData.put("ManaBonus",manaBonus);
            jsonData.put("TypeBonus", typeBonus);
        } catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Datei konnte nicht gefunden werden:\n" + e.toString(), "Datei nicht gefunden", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Data.json mit gesammelten Daten erzeugen
        saveNewJSON(jsonData.toString());
        //Temporäre XML Dateien wieder löschen
        if(tempWorldXML.delete()) {
            System.out.println("tempWorld.xml gelöscht");
            txtImport.appendText("tempWorld.xml gelöscht\n");
        }
        if(tempCommonXML.delete()) {
            System.out.println("tempCommon.xml gelöscht");
            txtImport.appendText("tempCommon.xml gelöscht\n");
        }
        saveStatistic("-----------------------------------------------------------");
        btnStart.setDisable(false);
    }
    private File createTempXML(File file) {
        //XML einlesen - "&" durch "&" ersetzen
        System.out.println(file+" wird temporär neu erstellt");
        String fileContent = "", line;
        try {
            FileReader fileReader = new FileReader(file);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            while((line = bufferedReader.readLine()) != null) {
                line = line.replace("&", "&");
                fileContent += line+"\n";
            }
            bufferedReader.close();
        } catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Datei konnte nicht gefunden werden:\n" + e.toString(), "Datei nicht gefunden", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Temporäre XML-Datei erzeugen
        File tempXML = null;
        if(file.equals(sourceWorldXML)) {
            tempXML = new File("tempWorld.xml");
        }
        if(file.equals(sourceCommonXML)) {
            tempXML = new File("tempCommon.xml");
        }
        if(tempXML != null) {
            try {
                FileWriter fw = new FileWriter(tempXML);
                BufferedWriter bw = new BufferedWriter(fw);
                bw.write(fileContent);
                bw.close();
                System.out.println("Temporäre Datei \""+tempXML+"\" erstellt!\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return tempXML;
    }
    private Document convertXML(File tempXML) {
        //tempXML parsen
        Document documentXML = null;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            documentXML = builder.parse(tempXML);
        } catch (SAXException | ParserConfigurationException | IOException e) {
            e.printStackTrace();
        }
        return documentXML;
    }
    private JSONObject createHeroClasses(JSONArray originalHeroClasses) {
        JSONObject objectHeroClasses = new JSONObject();
        for(int classNr=0; classNr<originalHeroClasses.length(); classNr++) {
            JSONObject heroClassOriginal = (JSONObject) originalHeroClasses.get(classNr);
            JSONObject heroClassNew = new JSONObject();
            //Name
            String className = findXMLContent(heroClassOriginal.getString("Name"), documentWorldXML);
            heroClassNew.put("Name", className);
            //Augments
            JSONArray arrayClassAugments = heroClassOriginal.getJSONArray("Augment");
            String augment_1 = arrayClassAugments.getString(0);
            String augment_2 = arrayClassAugments.getString(1);
            String augment_3 = arrayClassAugments.getString(2);
            heroClassNew.put("Augment_1", augment_1);
            heroClassNew.put("Augment_2", augment_2);
            heroClassNew.put("Augment_3", augment_3);
            JSONArray arrayClassAugmentNames = heroClassOriginal.getJSONArray("AugmentName");
            String augmentName_1 = findXMLContent(arrayClassAugmentNames.getString(0), documentWorldXML);
            String augmentName_2 = findXMLContent(arrayClassAugmentNames.getString(1), documentWorldXML);
            String augmentName_3 = findXMLContent(arrayClassAugmentNames.getString(2), documentWorldXML);
            heroClassNew.put("AugmentName_1", augmentName_1);
            heroClassNew.put("AugmentName_2", augmentName_2);
            heroClassNew.put("AugmentName_3", augmentName_3);
            //Traits
            JSONArray arrayClassTraits = heroClassOriginal.getJSONArray("Traits");
            String trait_1 = getTraitName(arrayClassTraits.getString(0));
            String trait_2 = getTraitName(arrayClassTraits.getString(1));
            String trait_3 = getTraitName(arrayClassTraits.getString(2));
            heroClassNew.put("Trait_1", trait_1);
            heroClassNew.put("Trait_2", trait_2);
            heroClassNew.put("Trait_3", trait_3);
            objectHeroClasses.put(className, heroClassNew);
            System.out.println("HeroClass: "+className);
        }
        txtImport.appendText("HeroClasses: "+objectHeroClasses.length()+"\n\n");
        saveStatistic("HeroClasses: "+objectHeroClasses.length());
        System.out.println("HeroClasses: "+objectHeroClasses.length());
        return objectHeroClasses;
    }
    private JSONObject createKingdoms(JSONArray originalKingdoms) {
        JSONObject objectKingdoms = new JSONObject();
        for(int kingdomNr=0; kingdomNr<originalKingdoms.length(); kingdomNr++) {
            JSONObject kingdomOriginal = (JSONObject) originalKingdoms.get(kingdomNr);
            JSONObject kingdomNew = new JSONObject();
            if(kingdomOriginal.getBoolean("Tutorial")) { //Tutorial Broken Spire filtern
                continue;
            }
            //Name
            String kingdomName = findXMLContent(kingdomOriginal.getString("Name"), documentWorldXML);
            kingdomNew.put("Name", kingdomName);
            //Banner
            String bannerName = findXMLContent(kingdomOriginal.getString("BannerName"), documentWorldXML);
            String bannerDesc = findXMLContent(kingdomOriginal.getString("BannerManaDescription"), documentWorldXML);
            kingdomNew.put("BannerName", bannerName);
            kingdomNew.put("BannerDescription", bannerDesc);
            //Einheiten
            JSONArray arrayTroopIds = kingdomOriginal.getJSONArray("TroopIds");
            JSONArray arrayTroopNames = getTroopNames(arrayTroopIds);
            kingdomNew.put("Troops", arrayTroopNames);
            //Bonus
            for(int i=2; i<5; i++) {
                int id = kingdomOriginal.getInt("Id");
                String bonusCode = "[BONUS_KINGDOM_"+id+"_"+i+"]";
                String bonus = findXMLContent(bonusCode, documentCommonXML);
                kingdomNew.put("Bonus_"+i, bonus);
                String bonusDescCode = "[BONUS_KINGDOM_DESCRIPTION_"+id+"_"+i+"]";
                String bonusDesc = findXMLContent(bonusDescCode, documentCommonXML);
                kingdomNew.put("Bonus_"+i+"_Description", bonusDesc);
            }
            //FileBase
            String fileBase = kingdomOriginal.getString("FileBase");
            kingdomNew.put("FileBase", fileBase);
            objectKingdoms.put(kingdomName, kingdomNew);
            if(kingdomOriginal.getBoolean("Used")) {
                System.out.println("Kingdom: "+kingdomName);
            } else {
                txtImport.appendText("Kingdom: "+kingdomName+" (Ungenutzt)\n");
                saveStatistic("Kingdom: "+kingdomName+" (Ungenutzt)");
                System.out.println("Kingdom: "+kingdomName+" (Ungenutzt)");
            }
        }
        txtImport.appendText("Kingdoms: "+objectKingdoms.length()+"\n\n");
        saveStatistic("Kingdoms: "+objectKingdoms.length());
        System.out.println("Kingdoms: "+objectKingdoms.length());
        return objectKingdoms;
    }
    private JSONObject createTraits(JSONArray originalTraits) {
        JSONObject objectTraits = new JSONObject();
        for(int traitNr=0; traitNr<originalTraits.length(); traitNr++) {
            JSONObject traitOriginal = (JSONObject) originalTraits.get(traitNr);
            JSONObject traitNew = new JSONObject();
            //Name
            String traitName = findXMLContent(traitOriginal.getString("Name"), documentWorldXML);
            traitNew.put("Name", traitName);
            //Beschreibung
            String traitDesc = findXMLContent(traitOriginal.getString("Description"), documentWorldXML);
            traitNew.put("Description", traitDesc);
            objectTraits.put(traitName, traitNew);
            System.out.println("Trait: "+traitName);
        }
        txtImport.appendText("Traits: "+objectTraits.length()+"\n\n");
        saveStatistic("Traits: "+objectTraits.length());
        System.out.println("Traits: "+objectTraits.length());
        return objectTraits;
    }
    private JSONObject createTroops(JSONArray originalTroops) {
        JSONObject objectTroops = new JSONObject();
        for(int troopNr = 0; troopNr< originalTroops.length(); troopNr++) {
            JSONObject troopOriginal = (JSONObject) originalTroops.get(troopNr);
            JSONObject troopNew = new JSONObject();
            if(troopOriginal.getInt("Id") == 6127) { //MegaGorgotha filtern
                continue;
            }
            //Name
            String troopName = findXMLContent(troopOriginal.getString("Name"), documentWorldXML);
            troopNew.put("Name", troopName);
            //Typ
            String typ = troopOriginal.getString("TroopType");
            troopNew.put("Typ", typ);
            //Rarity
            String rarity = getRarity(troopOriginal.getString("TroopRarity"));
            troopNew.put("Rarity", rarity);
            //Kingdom / used?
            int id = troopOriginal.getInt("Id");
            boolean used = false;
            for(int i=0; i<arrayKingdomsOriginal.length(); i++) {
                JSONObject kingdom = arrayKingdomsOriginal.getJSONObject(i);
                JSONArray troopIds = kingdom.getJSONArray("TroopIds");
                for(int j=0; j<troopIds.length(); j++) {
                    if(troopIds.getInt(j) == id) {
                        used = true;
                        String kingdomName = findXMLContent(kingdom.getString("Name"), documentWorldXML);
                        troopNew.put("Kingdom", kingdomName);
                        break;
                    }
                }
                if(used) {
                    break;
                }
            }
            //Manafarben
            JSONObject manaColors = troopOriginal.getJSONObject("ManaColors");
            troopNew.put("PrimaryColor", troopOriginal.getString("PrimaryColor"));
            troopNew.put("ManaColors", manaColors);
            //Zauber / Kosten
            int spellId = troopOriginal.getInt("SpellId");
            for(int i=0; i<arraySpellsOriginal.length(); i++) {
                JSONObject spell = arraySpellsOriginal.getJSONObject(i);
                if(spell.getInt("Id") == spellId) {
                    String spellName = findXMLContent(spell.getString("Name"), documentWorldXML);
                    troopNew.put("Spell", spellName);
                    troopNew.put("Cost", spell.getInt("Cost"));
                    break;
                }
            }
            //Traits
            JSONArray arrayTroopTraits = troopOriginal.getJSONArray("Traits");
            String trait_1 = getTraitName(arrayTroopTraits.getString(0));
            String trait_2 = getTraitName(arrayTroopTraits.getString(1));
            String trait_3 = getTraitName(arrayTroopTraits.getString(2));
            troopNew.put("Trait_1", trait_1);
            troopNew.put("Trait_2", trait_2);
            troopNew.put("Trait_3", trait_3);
            //Beschreibung
            String description = findXMLContent(troopOriginal.getString("Description"), documentWorldXML);
            troopNew.put("Description", description);
            //FileBase
            String fileBase = troopOriginal.getString("FileBase");
            troopNew.put("FileBase", fileBase);
            //Level Stats
            JSONArray healthIncrease = troopOriginal.getJSONArray("HealthIncrease");
            JSONArray armorIncrease = troopOriginal.getJSONArray("ArmorIncrease");
            JSONArray attackIncrease = troopOriginal.getJSONArray("AttackIncrease");
            JSONArray spellpowerIncrease = troopOriginal.getJSONArray("SpellPowerIncrease");
            int baseHealth = troopOriginal.getInt("Health_Base");
            int baseArmor = troopOriginal.getInt("Armor_Base");
            int baseAttack = troopOriginal.getInt("Attack_Base");
            int baseSpellpower = troopOriginal.getInt("SpellPower_Base");
            JSONArray healthLevel = calculateLevelStats(baseHealth, healthIncrease);
            troopNew.put("HealthPerLevel", healthLevel);
            JSONArray armorLevel = calculateLevelStats(baseArmor, armorIncrease);
            troopNew.put("ArmorPerLevel", armorLevel);
            JSONArray attackLevel = calculateLevelStats(baseAttack, attackIncrease);
            troopNew.put("AttackPerLevel", attackLevel);
            JSONArray magicLevel = calculateLevelStats(baseSpellpower, spellpowerIncrease);
            troopNew.put("MagicPerLevel", magicLevel);
            //Liste für alle Typen zur Kontrolle
            if(!listTypes.contains(troopOriginal.getString("TroopType"))) {
                listTypes.add(troopOriginal.getString("TroopType"));
            }
            if(used) {
                System.out.println("Troop: "+troopName);
            } else {
                txtImport.appendText("Troop: "+troopName+" (Ungenutzt)\n");
                saveStatistic("Troop: "+troopName+" (Ungenutzt)");
                System.out.println("Troop: "+troopName+" (Ungenutzt)");
            }
            objectTroops.put(troopName, troopNew);
        }
        txtImport.appendText("Troops: "+objectTroops.length()+"\n\n");
        saveStatistic("Troops: "+objectTroops.length());
        System.out.println("Troops: "+objectTroops.length());
        return objectTroops;
    }
    private JSONObject createSpells(JSONArray originalSpells) {
        JSONObject objectSpells = new JSONObject();
        for(int spellNr=0; spellNr<originalSpells.length(); spellNr++) {
            JSONObject spellOriginal = (JSONObject) originalSpells.get(spellNr);
            JSONObject spellNew = new JSONObject();
            //Name
            String spellName = findXMLContent(spellOriginal.getString("Name"), documentWorldXML);
            spellNew.put("Name", spellName);
            //Beschreibung
            String traitDesc = findXMLContent(spellOriginal.getString("Description"), documentWorldXML);
            spellNew.put("Description", traitDesc);
            objectSpells.put(spellName, spellNew);
            System.out.println("Trait: "+spellName);
        }
        txtImport.appendText("Traits: "+objectSpells.length()+"\n\n");
        saveStatistic("Traits: "+objectSpells.length());
        System.out.println("Traits: "+objectSpells.length());
        return objectSpells;
    }
    private JSONObject createWeapons(JSONArray originalWeapons) {
        JSONObject objectWeapons = new JSONObject();
        for(int weaponNr=0; weaponNr<originalWeapons.length(); weaponNr++) {
            JSONObject weaponOriginal = (JSONObject) originalWeapons.get(weaponNr);
            JSONObject weaponNew = new JSONObject();
            //Name
            String weaponName = findXMLContent(weaponOriginal.getString("Name"), documentWorldXML);
            weaponNew.put("Name", weaponName);
            //Rarity
            String rarity = getRarity(weaponOriginal.getString("WeaponRarity"));
            weaponNew.put("Rarity", rarity);
            //Mana Colors
            JSONObject manaColors = weaponOriginal.getJSONObject("ManaColors");
            weaponNew.put("ManaColors", manaColors);
            //FileBase
            String fileBase = weaponOriginal.getString("FileBase");
            weaponNew.put("FileBase", fileBase);
            objectWeapons.put(weaponName, weaponNew);
            System.out.println("Weapon: "+weaponName);
        }
        txtImport.appendText("Weapons: "+objectWeapons.length()+"\n\n");
        saveStatistic("Weapons: "+objectWeapons.length());
        System.out.println("Weapons: "+objectWeapons.length());
        return objectWeapons;
    }
    private String getRarity(String replace) {
        switch(replace) {
            case "Uncommon":
                return "Rare";
            case "Rare":
                return "UltraRare";
            case "UltraRare":
                return "Epic";
            case "Epic":
                return "Legendary";
            case "Legendary":
                return "Mythic";
            default:
                return "----";
        }
    }
    private JSONArray getTroopNames(JSONArray troopIds) {
        JSONArray troopNames = new JSONArray();
        for(int i=0; i<troopIds.length(); i++) {
            int id = troopIds.getInt(i);
            for(int j=0; j<arrayTroopsOriginal.length(); j++) {
                JSONObject troop = arrayTroopsOriginal.getJSONObject(j);
                if(troop.getInt("Id") == id) {
                    String troopName = findXMLContent(troop.getString("Name"), documentWorldXML);
                    troopNames.put(i, troopName);
                    break;
                }
            }
        }
        return troopNames;
    }
    private String getTraitName(String code) {
        String traitName = "----";
        for(int i=0; i<arrayTraitsOriginal.length(); i++) {
            JSONObject trait = arrayTraitsOriginal.getJSONObject(i);
            if(trait.getString("Code").equals(code)) {
                String trait1Code = trait.getString("Name");
                traitName = findXMLContent(trait1Code, documentWorldXML);
                return traitName;
            }
        }
        return traitName;
    }
    private JSONArray calculateLevelStats(int base, JSONArray increase) {
        JSONArray levelUp = new JSONArray();
        for(int i=0; i<increase.length(); i++) {
            if(i == 0) {
                levelUp.put(i, base+increase.getInt(i));
            } else {
                levelUp.put(i, levelUp.getInt(i-1)+increase.getInt(i));
            }
        }
        return levelUp;
    }
    private String findXMLContent(String searchString, Document documentXML) {
        String foundString;
        NodeList childList = documentXML.getElementsByTagName("Text");
        int length = childList.getLength();
        for(int i=0; i<length; i++) {
            if(childList.item(i).getAttributes().getLength() == 1) {
                NamedNodeMap nodemap = childList.item(i).getAttributes();
                if(nodemap.getNamedItem("tag").getTextContent().equals(searchString)) {
                    foundString = childList.item(i).getTextContent();
                    //System.out.println(searchString+" >>> "+foundString);
                    return foundString;
                }
            }
        }
        return searchString;
    }
    
    private void saveNewJSON(String jsonNew) {
        try {
            FileWriter fw = new FileWriter(saveAs);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(jsonNew);
            bw.close();
            System.out.println("Neue Datei \""+saveAs+"\" erstellt!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void saveStatistic(String save) {
        try {
            FileWriter fw = new FileWriter(new File("statistic.txt"), true);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.append(save).append("\n");
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}