"use strict;"
async function getAuthToken() {
    let storageData, dec, tok;
    storageData = window.sessionStorage.getItem("token");
    while (!tok) {
        storageData = window.sessionStorage.getItem("token");
        dec = JSON.parse(storageData);
        if (!!dec && "accessToken" in dec) {
            let tokInspect = dec.accessToken;
            if (tokInspect && tokInspect.startsWith("eyJ")) {
                tok = tokInspect;
            }
        } else {
            console.info("No accessToken available. Sleeping...")
            await new Promise(res => setTimeout(res, 5000));
        }
    }
    return tok;
}
function correlationId() {
    return crypto.randomUUID() + "_" + crypto.randomUUID()
}

async function getKundenkontoV2(){
    let tok = await getAuthToken();
    let req = await fetch("https://www.bahn.de/web/api/kundenkonto/v2", {
        headers: [
            ["Accept", "application/json"], ["authorization", "Bearer " + tok], //["X-Correlation-ID", correlationId()]
        ]
    });
    if(req.ok){
        const data = await req.json();
        return {
            "addr__appellation": data.anrede,
            "addr__firstName": data.vorname,
            "addr__surName": data.nachname,
            "bday": data.geburtsdatum,
            "addr__email": data.email,
            "addr__placename": data.hauptadresse.ort,
            "addr__postcode": data.hauptadresse.plz,
            "addr__street": data.hauptadresse.strasse,
            "addr__country": data.hauptadresse.land
        }
    }
    return {}
}

async function getBahncardInfo() {
    let tok = await getAuthToken();
    let req = await fetch("https://www.bahn.de/web/api/kundenkonto/bahncard", {
        headers: [
            ["Accept", "application/json"], ["authorization", "Bearer " + tok], //["X-Correlation-ID", correlationId()]
        ]
    });
    if (req.ok) {
        const data = await req.json();
        console.debug(data);
        const orders = data.bahnCardBestellungen.filter((order) => {
            return order.bahncardTyp === "BC100" && (Date.parse(order.gueltigAb) < Date.now())
        });
        console.debug("BahnCard candidates:", orders);
        if (orders[0] !== undefined) {
            // Orders are returned in reverse chronological order.
            // TODO Ask which one if there are multiple.
            // (Maybe inject a <dialog> element here, those have <input type=radio> and dropdowns.)
            return orders[0].bcNummer || false;
        }
    } else {
        console.error("Request failed:", req);
        return false;
    }
}
browser.storage.sync.get(["acquireAll","acquireBahncard"]).then(v => {
    if (v.acquireAll!=false){
        Promise.all([getKundenkontoV2(), getBahncardInfo()]).then(data => {
            const saveData = {...data[0], "bcnum": data[1], "acquireAll": false};
            console.info("Saving", saveData);
            browser.storage.sync.set(saveData).then(() => window.close())
        })
    }
    if (v.acquireBahncard != false) { // may also be undefined, so no identity check here
        getBahncardInfo().then(v => {
            if (!!v && v.length == 16) {
                const saveData = { "bcnum": v, "acquireBahncard": false }
                console.info("Saving", saveData);
                browser.storage.sync.set(saveData).then(() => window.close());
            }
        }, f => console.error("Could not acquire BahnCard number.", f))
    }
})