class ixcAjax {
    constructor(options) {
        this.mapaController = options.mapaController;
        this.historicoRequisicoes = {};
    }


    // TODO: Versões antigas dos navegadores ainda não suportam
    // static historicoRequisicoes = {};

    static callbackStatus(options) {
        return {
            success: options.callbackSuccess || (() => {}),
            fail: options.callbackFail || (() => {})
        }
    }

    DefaultAjax(options, others) {
        options = options || {};

        let callback = ixcAjax.callbackStatus(options);

        let center = this.mapaController.getCenter();
        let zoom = this.mapaController.getZoom();

        let data = options.data || '{"centerLat" : "' + center[0] + '", "centerLon" : "' + center[1] + '", "zoomMap" : "' + zoom + '"}';

        let request = $.ajax({
            url: options.url,
            type: options.method || "post",
            data: data,
            dataType: options.dataType || 'json',
            success: function (data) {
                callback.success.call(this, data);
            },
            fail: function () {
                callback.fail.call(this);
            }
        });

        //IMDK-113 controle do ajax da ultima requisição feita caso status for diferente de 4 ele cancela a requisição armazenada anteriormente
        if (options.abortPrevious) {
            if ((options.url in this.historicoRequisicoes) && this.historicoRequisicoes[options.url].readyState !== 4) {
                this.historicoRequisicoes[options.url].abort();
            }
            this.historicoRequisicoes[options.url] = request;
        }

        return request;
    }

    async SaveFeature(options) {
        options = options || {};

        let callback = ixcAjax.callbackStatus(options);
        let stringJson = await this.mapaController.getJsonObject(options.feature);

        $.ajax({
            url: options.url || 'php/index.php/doc/elementos/' + options.action,
            type: options.method || "post",
            dataType: options.dataType || 'json',
            data: '{"json":' + stringJson + ', "action": "' + options.action + '"}',
            success: function (data) {
                callback.success.call(this, data);
            },
            fail: function () {
                callback.fail.call(this);
            }
        });
    }


    AjaxWithoutMapFeatures(options) {
        options = options || {};
        let callback = ixcAjax.callbackStatus(options);

        let request = $.ajax({
            url: options.url,
            type: options.method || "post",
            data: options.data,
            dataType: options.dataType || 'json',
            headers : options.headers ? options.headers : {},
            success: function (data) {
                callback.success.call(this, data);
            },
            fail: function () {
                callback.fail.call(this);
            }
        });

        //IMDK-113 controle do ajax da ultima requisição feita caso status for diferente de 4 ele cancela a requisição armazenada anteriormente
        if (options.abortPrevious) {
            if ((options.url in this.historicoRequisicoes) && this.historicoRequisicoes[options.url].readyState !== 4) {
                this.historicoRequisicoes[options.url].abort();
            }
            this.historicoRequisicoes[options.url] = request;
        }

        return request;
    }
}
