export class LiturgyData {

    static ranks = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"]

    static #ranks = [
        {
            index: 0,
            name: "O",
            lkp: 3,
            mod: 2,
            costKaP: 2,
            costKaPPermant: 0,
            duration: "Augenblicklich",
            castDuration: "Stoßgebet",
            strength: "LkP*/2"
        },
        {
            index: 1,
            name: "I",
            lkp: 3,
            mod: 0,
            costKaP: 5,
            costKaPPermant: 0,
            range: "Selbst",
            castDuration: "Gebet",
            duration: "LkP* KR",
            strength: "LkP*/2"
        },
        {
            index: 2,
            name: "II",
            lkp: 6,
            mod: -2,
            costKaP: 10,
            costKaPPermant: 0,
            range: "Berührung",
            target: ["Geweihter"],
            castDuration: "Andacht",
            duration: "LkP*10 KR",
            strength: "LkP/2+5"
        },
        {
            index: 3,
            name: "III",
            lkp: 9,
            mod: -4,
            costKaP: 15,
            costKaPPermant: 0,
            range: "Sicht",
            target: ["1 Person", "1 Objekt"],
            castDuration: "Zeremonie",
            duration: "LkP* Spielrunden",
            strength: "LkP*+5"
        },
        {
            index: 4,
            name: "IV",
            lkp: 12,
            mod: -6,
            costKaP: 20,
            costKaPPermant: 0,
            range: "Fern",
            target: ["10 Personen", "10 Objekte"],
            castDuration: "Zyklus",
            duration: "LkP* Stunden",
            strength: "LkP*+10"
        },
        {
            index: 5,
            name: "V",
            lkp: 15,
            mod: -8,
            costKaP: 25,
            costKaPPermant: 1,
            target: ["100 Personen", "100 Objekte"],
            duration: "LkP* Tage",
            strength: "LkP*+15"
        },
        {
            index: 6,
            name: "VI",
            lkp: 18,
            mod: -10,
            costKaP: 30,
            costKaPPermant: 3,
            target: ["1000 Personen", "1000 Objekte"],
            duration: "LkP* Wochen",
            strength: "LkP*+20"
        },
        {
            index: 7,
            name: "VII",
            lkp: 21,
            mod: -12,
            costKaP: 35,
            costKaPPermant: 5,
            duration: "LkP* Monate",
            strength: "LkP*+25"
        },
        {
            index: 8,
            name: "VIII",
            lkp: 24,
            mod: -14,
            costKaP: 40,
            costKaPPermant: 7,
            duration: "LkP* Jahre oder permanent",
            casttime: "",
            strength: "LkP*+30"
        },
    ];

    static alverans = [
        "Praios",
        "Rondra",
        "Efferd",
        "Travia",
        "Boron",
        "Hesinde",
        "Firun",
        "Tsa",
        "Phex",
        "Peraine",
        "Ingerimm",
        "Rahja"
    ]

    static #aliases = [
        {
            "originalName": "Handwerkssegen",
            "aliases": ["Cereborns Handreichung", "Hauch der Leidenschaft"]
        },
        {
            "originalName": "Heiliger Befehl",
            "aliases": ["Wort der Wahrheit"],
        },
        {
            "originalName": "Eidsegen",
            "aliases": ["Lehnseid"],
        }
    ]

    static getModifiedStrength(originalString, rankIncrease) {
        // TODO as "Flagge des Regenbogens" demonstrates there may be different variations of Strengths which separately needs to be adjusted

        return Object.assign({}, this.#ranks[this.#ranks.findIndex(p => p.strength === originalString) + rankIncrease])
    }

    static getModifiedDuration(originalString, rankIncrease) {


        let currentDuration = 0
        let durationText = ""
        let adjustedDurationText = ""
        let found = false
        for (let {duration} of this.#ranks) {
            if (originalString.indexOf(duration) !== -1) {
                durationText = duration
                adjustedDurationText = this.#ranks[currentDuration + rankIncrease].duration
                found = true
                break
            }
            ++currentDuration
        }

        if (found) {
            durationText = this.#ranks[currentDuration].duration
            return {currentDuration, durationText, adjustedDurationText}
        }

        return {currentDuration: 0, durationText: originalString, adjustedDurationText: originalString}
    }

    static getModifiedRank(rank) {
        return Object.assign({}, LiturgyData.#ranks[rank])
    }

    static getRankOfLiturgy(liturgy, deity) {
        const lookupData = liturgy.herkunft.find(p => p.name === deity)
        const rank = lookupData?.grad
        return Object.assign({}, LiturgyData.#ranks[rank])
    }

    static lookupAlias(alias) {
        return LiturgyData.#aliases.find((entry) => {
            return entry.aliases.indexOf(alias) !== -1
        })?.originalName ?? alias // cant determine thus simply return the original query name
    }

}
