function FerramentaHistoricoViewModel(data) {
    const mSelf = this;
    mSelf.Data = ko.observable(new FerramentaHistoricoOpcoes(mSelf));
    mSelf.FerramentaId = data.FerramentaId;
    mSelf.Template = data.Template;
    mSelf.Nome = data.Nome;
    mSelf.Titulo = data.Titulo;
    mSelf.NomeBotao = data.NomeBotao;
    mSelf.Icone = data.Icone;
    mSelf.Ordem = 3;
    mSelf.Visivel = ko.observable(true);

    mSelf.Init = () => { };
    mSelf.Destroy = () => mSelf.Data().Destroy();
}

function FerramentaHistoricoOpcoes() {
    const mSelf = this;
    mSelf.DataInicial = ko.observable();
    mSelf.HoraInicial = ko.observable();
    mSelf.DataFinal = ko.observable();
    mSelf.HoraFinal = ko.observable();
    mSelf.HistoricoPlotado = ko.observable(false);
    mSelf.ItensExpotar = ko.observableArray([{ Nome: 'XML', Valor: 'XML', Selecionado: ko.observable(false) }]);
    mSelf.PlanejamentoHistorico = ko.observable();
    mSelf.ListaHistoricoBuscado = ko.observable(null);
    mSelf.ListaHistoricoParadoBuscado = ko.observable(null);
    mSelf.PolylineHistoricoId = ko.observable('polylineHistorico');
    mSelf.FerramentasDependentes = ko.observableArray(['FerramentaPosicionamento', 'FerramentaVisualizacao']);
    mSelf.DataCompletaInicial = ko.observable();
    mSelf.DataCompletaFinal = ko.observable()

    mSelf.BtnBuscarHistorico = () => {
        if (mSelf.ValidarDatasFiltro()) {
            mSelf.HistoricoPlotado(true);
            $('.loading-inlog').fadeIn(500);

            const param = {
                'codigoVeiculo': vm.Perspectiva.VeiculoId(),
                'dataInicio': mSelf.DataCompletaInicial(),
                'dataFim': mSelf.DataCompletaFinal()
            };

            $.ajax({
                url: urlGlobal + 'RastreamentoGeral/VeiculoGenericoDetalhes/BuscarHistorico',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                type: 'GET',
                data: param,
                success: mSelf.OnBuscarHistorico,
                complete: () => { }
            });
        }
    };

    mSelf.BtnExportarHistoricoXml = () => {
        const itensSelecionados = [];
        ko.utils.arrayForEach(mSelf.ItensExpotar(), (item) => {
            if (item.Selecionado()) itensSelecionados.push(item);
        });

        if (mSelf.ValidarDatasFiltro() && itensSelecionados.length > 0) {
            $('.loading-inlog').fadeIn(500);

            window.open(urlGlobal + 'RastreamentoGeral/VeiculoGenericoDetalhes/ExportarHistoricoParaXml?codigoVeiculo=' + vm.Perspectiva.VeiculoId() +
                '&dataInicio=' + mSelf.DataCompletaInicial() + '&dataFim=' + mSelf.DataCompletaFinal(), 'Exportar');

            $('.loading-inlog').fadeOut(500);
        }
    };

    mSelf.OnBuscarHistorico = (data) => {
        $('.loading-inlog').fadeOut(500);
        if (data != null) {
            data = ko.mapping.fromJS(data);

            if (data.Lista().length > 0) {
                if (mSelf.PlanejamentoHistorico()) {
                    mSelf.LimparFuncionalidades();
                }

                mSelf.ListaHistoricoBuscado = data.Lista;
                mSelf.ListaHistoricoParadoBuscado = data.PontosParada;

                if (mSelf.PlanejamentoHistorico()) {
                    mSelf.PlanejamentoHistorico().PlotarHistorico(data);
                }
                else mSelf.PlanejamentoHistorico(new PlanejamentoHistorico(data));

                /* Preenche o painel de Estatísticas */
                if (data.Estatisticas) {
                    mSelf.PreencheEstatisticas(data.Estatisticas);
                }

                /* habilita as ferramentas dependentes */
                vm.Perspectiva.AtualizaListaFerramentas(mSelf.FerramentasDependentes(), true);

                mSelf.HistoricoPlotado(true);
            } else {
                vm.FecharTodosMensagemAlerta();
                vm.ShowMensagemAlerta('Nenhum registro encontrado!');
            }
        }
    };

    mSelf.BtnExportarXML = () => {
        if (mSelf.ValidarDatasFiltro()) {
            $('.loading-inlog').fadeIn(500);

            const param = {
                'codigoVeiculo': vm.Perspectiva.VeiculoId(),
                'dataInicio': mSelf.DataInicial(),
                'dataFim': mSelf.DataFinal()
            };

            $.ajax({
                url: 'Comum/Comum/BuscarHistoricoXML',
                contentType: 'application/json; charset=utf-8',
                type: 'GET',
                data: param,
                success: mSelf.OnBuscarHistorico,
                complete: () => { }
            });
        }
    };

    mSelf.PreencheEstatisticas = (data) => {
        const moduloEstatistica = vm.GetModuloMenuLateral('EstatisticasViewModel');

        if (moduloEstatistica) {
            moduloEstatistica.Data.PossuiHistorico(data ? true : false);
            moduloEstatistica.Data.VelocidadeMedia(data ? data.VelocidadeMedia() : data);
            moduloEstatistica.Data.Distancia(data ? data.DistanciaTotal() : data);
            moduloEstatistica.Data.TempoParadoTotal(data ? data.TempoParadoTotal() : data);
            moduloEstatistica.Data.TempoMovimentoTotal(data ? data.TempoMovimentoTotal() : data);
            moduloEstatistica.Data.TempoTotal(data ? data.TempoTotal() : data);
            moduloEstatistica.Data.TempoParadoConsiderado(data ? data.TempoParadoConsiderado() : data);
            moduloEstatistica.Data.TempoMovimentoConsiderado(data ? data.TempoMovimentoConsiderado() : data);
            moduloEstatistica.Data.NumeroParadas(data ? data.NumeroParadas() : data);
            moduloEstatistica.Data.VelocidadeMediaConsiderada(data ? data.VelocidadeMedia() : data);
        }
    }

    mSelf.BtnLimparHistorico = () => {
        mSelf.DataInicial(null);
        mSelf.DataFinal(null);
        mSelf.HoraInicial(null);
        mSelf.HoraFinal(null);

        if (mSelf.HistoricoPlotado()) {
            mSelf.LimparDadosHistorico();
            mSelf.HistoricoPlotado(false);

            const ferramenta = vm.GetFerramenta('FerramentaUltimasPosicoes');
            if (ferramenta) {
                ferramenta.Data().QuantidadePosicoes(0);
            }
        }
    };

    mSelf.LimparDadosHistorico = () => {
        if (mSelf.PlanejamentoHistorico()) {
            mSelf.PlanejamentoHistorico().Destroy();
        }

        mSelf.ListaHistoricoBuscado(null);
        mSelf.ListaHistoricoParadoBuscado(null);
        vm.Perspectiva.AtualizaListaFerramentas(mSelf.FerramentasDependentes(), false);

        //Limpar estatísticas
        mSelf.PreencheEstatisticas(null);
    };

    mSelf.ValidarDatasFiltro = function () {
        if (mSelf.DataInicial() != null && mSelf.DataInicial() != '' && mSelf.DataFinal() != null && mSelf.DataFinal() != ''
            && mSelf.HoraInicial() != null && mSelf.HoraInicial() != '') {

            const dtInicial = new Date((this.DataInicial() + 'T' + this.HoraInicial()));
            const dtFinal = new Date(this.DataFinal() + 'T' + this.HoraFinal());
            if (isNaN(dtInicial.getTime())) {
                vm.ShowMensagemAlerta('A data inicial informada não é válida!');
                return;
            }

            if (isNaN(dtFinal.getTime())) {
                vm.ShowMensagemAlerta('A data final informada não é válida!');
                return;
            }

            mSelf.DataCompletaInicial(this.DataInicial() + 'T' + this.HoraInicial());
            mSelf.DataCompletaFinal(this.DataFinal() + 'T' + this.HoraFinal());

            if (dtFinal > dtInicial) {
                const d = 1000 * 60 * 60 * 24;
                const df = new Date(this.DataFinal());
                const di = new Date(this.DataInicial());
                const days = Math.round(df.getTime() - di.getTime()) / d;

                if (days > 1) {
                    vm.ShowMensagemAlerta('Período de dias com valor alto, informe um range menor que um dia.');
                    return false;
                }
                return true;
            }
            else vm.ShowMensagemAlerta('A data final deve ser maior que a data inicial.');
        }
        else vm.ShowMensagemAlerta('As datas inicial e final devem ser informadas!');

        return false;
    };

    mSelf.Destroy = () => mSelf.BtnLimparHistorico();
    mSelf.LimparFuncionalidades = () => vm.GetFerramenta('FerramentaVisualizacao').Data().LimparFuncionalidades();

    mSelf.CopiarDataHistorico = () => {
        if (mSelf.DataInicial() != null && mSelf.DataFinal() != '') {
            mSelf.DataFinal($('#Detalhes-HistoricoDataInicial').val());
            mSelf.HoraInicial('00:00');
            mSelf.HoraFinal('00:00');
        }
    };
}