import {WebSocketEvent} from "./WebSocketEvent";

export class WebSocketPayload {
    set event(value: WebSocketEvent) {
        this._event = value;
    }

    set status(value: boolean) {
        this._status = value;
    }

    set data(value: object | undefined) {
        this._data = value;
    }

    private _event: WebSocketEvent;
    private _status: boolean;
    private _data: object | undefined;


    get event(): WebSocketEvent {
        return this._event;
    }

    get status(): boolean {
        return this._status;
    }

    get data(): object | undefined {
        return this._data;
    }

    constructor(event: WebSocketEvent, status: boolean, data?: object) {
        this._event = event;
        this._status = status;
        this._data = data;
    }

    public static parseFromJSON(json: string): WebSocketPayload | null {
        json = (window) ? atob(json) : Buffer.from(json, "base64").toString();
        let rawPayload: { event: string, status: boolean, data: object };
        try {
            rawPayload = JSON.parse(json);
        } catch (e) {
            return null;
        }

        let wsEvent = <keyof typeof WebSocketEvent> rawPayload.event;

        return new WebSocketPayload(wsEvent, rawPayload.status, rawPayload.data);
    }
}