'use strict';
import Secure from './secured.js';
// import * as jose from 'jose';  // per la gestione del token
// const axios = require("axios").default;


const mySecure = new Secure();


const uri = window.location.toString();

if(!uri.includes('#')) {
    const a = document.getElementById("my-link");
    a.href = a.href.replace("$MY_CODE_CHALLENGE", mySecure.codeChallenge).replace("$MY_STATE", mySecure.state);
    sessionStorage.setItem("stateSent", mySecure.state); // state inviato durante la richiesta dell'authcode
    sessionStorage.setItem("codeVerifier", mySecure.codeVerifier);
}
else {
    // l'uri e' del tipo localhost:3000/secured# seguito da parametri
    const uriSplit = uri.split('#');
    const params = uriSplit[1].split('&');
    const uriState = queryStringGetValue(params[0]);
    const uriAuthCode = queryStringGetValue(params[2]);
    const body = document.getElementById('body-id');
    body.innerHTML = "";
    if(!sessionStorage.stateSent || sessionStorage.stateSent !== uriState) {
        body.innerHTML =  `Errors in the request!`; 
    }
    else {
        // post per la richiesta del token
        
        // const options = {
        //     method: 'POST',
        //     url: 'http://localhost:8080/realms/$REALM/protocol/openid-connect/token',
        //     headers: {'content-type': 'application/x-www-form-urlencoded'},
        //     data: new URLSearchParams({
        //         grant_type: 'authorization_code',
        //         client_id: 'myclient',
        //         code_verifier: sessionStorage.getItem("codeVerifier"),
        //         code: uriAuthCode,
        //         redirect_uri: 'https://localhost:3000/secured'
        //     })
        // };

        // axios.request(options).then(function (response) {
        //     console.log(response.data);
        // }).catch(function (error) {
        //     console.error(error);
        // });


        const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token';
        // const xhr = new XMLHttpRequest();
        // xhr.responseType = 'json';
        // xhr.open("POST", url, true);
        // xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        // xhr.send(new URLSearchParams({
        //     grant_type: 'authorization_code',
        //     client_id: 'myclient',
        //     code_verifier: sessionStorage.getItem("codeVerifier"),
        //     code: uriAuthCode,
        //     redirect_uri: 'http://localhost:3000/secured'
        // }));
        // console.log(xhr.response);

        // fetch(url, {
        //     method: 'POST',
        //     headers: {
        //         'Content-type':'application/x-www-form-urlencoded'
        //     },
        //     body: new URLSearchParams({
        //         grant_type: 'authorization_code',
        //         client_id: 'myclient',
        //         code_verifier: sessionStorage.getItem("codeVerifier"),
        //         code: uriAuthCode,
        //         redirect_uri: 'http://localhost:3000/secured'
        //     })
        // }).then((response)=> { 
        //     response.json().then((ris) => console.log(ris))
        // });


        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-type':'application/x-www-form-urlencoded'
            },
            body: new URLSearchParams({
                grant_type: 'authorization_code',
                client_id: 'myclient',
                code_verifier: sessionStorage.getItem("codeVerifier"),
                code: uriAuthCode,
                redirect_uri: 'http://localhost:3000/secured'
            })
        });
        const token = await response.json();
        console.log(token);
            
            // DA FARE: capire come richiedere il refresh token
            // fare una get /secured/domains per ottenere tutte le informazioni dal domain manager sui miei domini
        
        



    }
}

/**
     * Ottengo il valore associato al parametro. 
     * @param {*} queryString query string del tipo parametro=valore.
     * @returns il valore associato al parametro.
     */
function queryStringGetValue(queryString) {
    const arr = queryString.split('=');
    return arr[1];
}