'use strict';
import {getToken} from "./script.js";
import Domain from "./domain.js";

class RequestToDomain {

    constructor() {
    }


    /**
    * Funzione per ottenenere dal domain manager tutte le informazioni
    * sui domini dell'utente che ha effettuato il login
    */
    static async getMyDomains() {
        /*const div = document.createElement('div');
        div.innerHTML = "cliccami per avere info";
        div.addEventListener('click', async () => {
            const responseDomain = await fetch('http://localhost:8080/realms/test00/protocol/openid-connect/userinfo', {  // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager
                method: 'GET',
                headers: {
                    'Authorization': `Bearer ${await getToken()}`
                }
            }) ;
            const domainsJson = await responseDomain.json();
            if(responseDomain.ok) {
                console.log(domainsJson);
            }
        });
        document.getElementsByTagName('body')[0].appendChild(div);*/
        const responseDomain = await fetch('http://localhost:3001/secured/domains/', {  // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager
            method: 'GET',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            }
        });
        const domainsJson = await responseDomain.json();
        if(responseDomain.ok) {
            const domainsArray = domainsJson.response;
            const myDomains = domainsArray.map((d) => {
                Domain.from(d)
            });
            return myDomains;
        }
        else
            throw domainsJson;
    }


    /**
     * Effettua la richiesta per creare un nuovo dominio.
     * @param {*} json descrizione json del dominio che si vuole creare.
     * @returns true se il dominio è stato creato,
     * false altrimenti.
     */
    static async createNewDomain(json) {
        const response = await fetch('http://localhost:3001/install/', {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            },
            body: JSON.stringify(json)
        });
        if(response.ok) {
            return true;
        }
        else {
            return false;
        }
    }


    /**
     * Effettua la richiesta al domain manager per ottenere tutti i sevizi
     * disponibili.
     */
    static async getAllServices() {
        const responseDomain = await fetch('http://localhost:3001/secured/services/', {  // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager
            method: 'GET',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            }
        }) ;
        const servicesJson = await responseDomain.json();
        if(responseDomain.ok) {
            const servicesArray = servicesJson.response;
            return servicesArray;
        }
        else
            throw servicesJson;
    }

    /**
     * Effettua la richiesta al domain manager per ottenere tutti i servizi in uso dal dominio
     * @param {*} domain
     * @returns
     */
     static async getUsedServices(domain) {
        const response = await fetch(`http://localhost:3001/secured/services?domain=${domain}`, {
            method: 'GET',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            }
        });
        const servicesJson = await response.json();//{response: ["servizio1", "servizio2"]};
        if(response.ok) {
            return servicesJson.response;
        }
        else
            throw servicesJson;
    }

    /**
     * Effettua la richiesta al domain manager per far partire un dominio.
     * @param {*} d dominio che si vuole far partire.
     * @returns true se il dominio è stato fatto partire,
     * false altrimenti.
     */
     static async startDomain(d) {
        const response = await fetch('http://localhost:3001/start/', {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            },
            body: JSON.stringify({domain: d.nome})
        });
        if(response.ok) {
            return true;
        }
        else {
            return false;
        }
    }


    /**
     * Effettua la richiesta al domain manager per fermare un dominio.
     * @param {*} d dominio che si vuole fermare.
     * @returns true se il dominio è stato fermato,
     * false altrimenti.
     */
     static async stopDomain(d) {
        const response = await fetch('http://localhost:3001/stop/', {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            },
            body: JSON.stringify({domain: d.nome})
        });
        if(response.ok) {
            return true;
        }
        else {
            return false;
        }
    }


    /**
     * Effettua la richiesta al domain manager per cancellare un dominio.
     * @param {*} d dominio che si vuole cancellare.
     * @returns true se la cancellazione è andata a buon fine,
     * false altrimenti.
     */
    static async deleteDomain(d) {
        const response = await fetch('http://localhost:3001/delete/', {
                        method: 'POST',
                        headers: {
                            'Authorization': `Bearer ${await getToken()}`
                        },
                        body: JSON.stringify({domain: d.nome})
                    });
        if(response.ok) {
            return true;
        }
        else {
            return false;
        }
    }
    /**
     * Effettua la richiesta al domain manager per sapere se l'utente e' un amministratore del dominio o meno
     * @param {*} domain
     * @returns
     */
    static async getUserPriviledges(domain) {
        const response = await fetch(`http://localhost:3001/secured/privileges?domain=${domain}`, {
            method: 'GET',
            headers: {
                'Authorization': `Bearer ${await getToken()}`
            }
        });
        const privilegesJson = await response.json();//{response: "U"} || {response: "A"};
        if(response.ok) {
            return privilegesJson.response;
        }
        else
            throw privilegesJson;
    }
}

export default RequestToDomain;