import { Injectable, EventEmitter } from '@angular/core';
import { JwtHelper } from 'angular2-jwt';
import { BannerMessageStatusEn } from '../common/enums';
import { Globals } from '../common/globals';
import { JwtPayload } from '../model/jwt-payload';


@Injectable()
export class SessionContext {
    public centralHttpResultCode$: EventEmitter<number> = new EventEmitter<number>();
    public settings;
    private my: string;

    public getCurrSessionId(): string { return localStorage.getItem(Globals.LOCALSTORAGE_SESSION_ID); }
    public setCurrSessionId(sid: string): void { localStorage.setItem(Globals.LOCALSTORAGE_SESSION_ID, sid); }

    public clearStorage() {
        localStorage.clear();
    }

    public getAccessToken(): string {
        return localStorage.getItem(Globals.ACCESS_TOKEN);
    }

    public setAccessToken(accessToken: string): void {
        localStorage.setItem(Globals.ACCESS_TOKEN, accessToken);
    }

    public getAccessTokenDecoded(): JwtPayload {
        const accessToken = this.getAccessToken();
        if (!accessToken) {
            return;
        }
        const jwtHelper: JwtHelper = new JwtHelper();
        const jwtPayload: JwtPayload = new JwtPayload();
        const decoded: any = jwtHelper.decodeToken(accessToken);
        jwtPayload.name = decoded.name;
        jwtPayload.roles = decoded.roles;
        return jwtPayload;
    }
}
