function ModuloCadastroModeloRD(data) {
    let mSelf = this;
    mSelf.Titulo = data.Titulo;
    mSelf.ModuloId = data.ModuloId;
    mSelf.Template = data.Template;
    mSelf.Data = ko.observable(new ModuloCadastroModeloRDData());
    mSelf.Init = () => mSelf.Data().Init();
}

function ModuloCadastroModeloRDData() {
    let mSelf = this;

    mSelf.DadosOperacao = ko.observable(null);
    mSelf.ApontamentosRD = ko.observable(null);

    mSelf.IdProximo = ko.observable(1);
    mSelf.ListaFuncoes = ko.observableArray([]);
    mSelf.OpcoesFuncoes = ko.observableArray([]);

    mSelf.Init = () => {
        mSelf.DadosOperacao(new DadosOperacao(mSelf));
        mSelf.ApontamentosRD(new ApontamentosRD(mSelf));

        if (vm.Codigo) {
            mSelf.CarregarModelo();
        }
    };

    mSelf.CarregarConfiguracao = (codigoMacro, callback) => {
        params = {
            codigoMacro: codigoMacro
        };
        $.ajax({
            url: `${urlGlobal}EditorRD/EditorRD/CarregarConfiguracoes`,
            dataType: 'json',
            type: 'GET',
            data: ko.toJS(params),
            beforeSend: () => $('.loading-div').fadeIn(),
            success: (data) => {
                mSelf.Configuracoes = data;
                if (callback)
                    callback();
                if (!mSelf.Configuracoes || !mSelf.Configuracoes.length) {
                    vm.Perspectiva.AbrirConfirmacao('Alguns campos não foram configurados para essa macro. Por favor, entre em contato com consultor.',
                        () => vm.ShowMensagemAlerta('Entre em contato com o consultor!'), null, 'Ok, Entendi!', true);
                }
            },
            error: (erro) => console.log(erro),
            complete: () => $('.loading-div').fadeOut()
        });
    };

    mSelf.CarregarModelo = () => {
        params = {
            codigo: vm.Codigo
        };
        $.ajax({
            url: `${urlGlobal}EditorRD/EditorRD/CarregarModeloRD`,
            dataType: 'json',
            type: 'GET',
            data: ko.toJS(params),
            beforeSend: () => $('.loading-div').fadeIn(),
            success: (data) => {
                mSelf.CarregarConfiguracao(data.DadosOperacao.Macro.Codigo, () => {
                    mSelf.CarregarModeloRD = new CarregarModeloRD(mSelf, data);
                    alterarEstilosEdicao();
                });
            },
            error: (erro) => console.log(erro),
            complete: () => $('.loading-div').fadeOut()
        });
    };

    mSelf.VoltarPaginaListagemModelos = () => window.open(`${urlGlobal}EditorRD/EditorRD/ListagemModeloRD`, '_self', false);

    mSelf.VoltarPaginaInicial = () => window.open(`${urlGlobal}EditorRD/EditorRD`, '_self', false);

    mSelf.AdicionarFuncao = (data, evt, top) => {
        if (!$(evt.target).hasClass('disabled-plus-bnt')) {

            if (top) {
                mSelf.ListaFuncoes.splice(0, 0, {
                    Id: mSelf.IdProximo(),
                    NomeFuncao: 'SELECIONE',
                    CodigoMacroFuncao: 0,
                    Posicao: 0,
                    ListaApontamentos: ko.observableArray([]),
                    IdProximo: 1,
                    OpcoesApontamentos: [],
                    Visivel: ko.observable(false)
                });

            } else {
                let i = mSelf.ListaFuncoes.indexOf(data) + 1;
                mSelf.ListaFuncoes.splice(i, 0, {
                    Id: mSelf.IdProximo(),
                    NomeFuncao: 'SELECIONE',
                    CodigoMacroFuncao: 0,
                    Posicao: 0,
                    ListaApontamentos: ko.observableArray([]),
                    IdProximo: 1,
                    OpcoesApontamentos: [],
                    Visivel: ko.observable(false)
                });
            }
            RegistrarCombobox(`ComboFuncao${mSelf.IdProximo()}`);

            mSelf.IdProximo(mSelf.IdProximo() + 1);
        }
    };

    mSelf.ExcluirFuncao = (data) => mSelf.ListaFuncoes.remove(data);

    mSelf.ConfirmacaoExcluirFuncao = (data, evt) => {
        let msg = data.ListaApontamentos().length > 0 ? `Tem certeza que deseja excluir a função ${data.NomeFuncao} e os seus apontamentos?` :
            `Tem certeza que deseja excluir a função ${data.NomeFuncao}?`;

        vm.Perspectiva.AbrirConfirmacao(msg, mSelf.ExcluirFuncao, data);
    };

    mSelf.SelecionarFuncao = (data, evt, obj) => {
        obj.NomeFuncao = data.Descricao;
        obj.CodigoMacroFuncao = data.Codigo;
        obj.Posicao = data.Posicao;
        obj.Visivel(true);

        mSelf.ApontamentosRD().CarregarApontamentos(mSelf.DadosOperacao().MacroSelecionada().Codigo, obj.Posicao, obj);

        $(`#ComboFuncao${obj.Id} .sel-val`).removeClass('linha-vermelha');
    };

    mSelf.GetModeloObjeto = () => {
        const funcoes = mSelf.ListaFuncoes().map((f) => {
            return {
                Codigo: f.Codigo,
                Posicao: f.Posicao,
                ListaAptosFilhos: f.ListaApontamentos().map(a => {
                    return {
                        Codigo: a.Codigo,
                        Posicao: a.Posicao,
                        Id: a.Id,
                        PosicaoValorValidoSelecionado: a.ValorValidoSelecionado ?
                            a.ValorValidoSelecionado.Posicao : null
                    };
                }),
                Id: f.Id
            };
        });

        const dadosOperacao = mSelf.DadosOperacao();
        const modeloRD = {
            CodigoModelo: vm.Codigo,
            CodigoMacro: dadosOperacao.MacroSelecionada().Codigo,
            CodigoOperacao: dadosOperacao.OperacoesSelecionada().Codigo,
            Descricao: dadosOperacao.NomeModelo(),
            Funcoes: funcoes
        };

        return modeloRD;
    };

    mSelf.Salvar = () => {
        vm.FecharTodosMensagemAlerta();
        const modeloRD = mSelf.GetModeloObjeto();

        if (!mSelf.ModeloValido(modeloRD))
            return;

        $.ajax({
            url: `${urlGlobal}EditorRD/EditorRD/SalvarModeloRD`,
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            type: 'POST',
            data: JSON.stringify(modeloRD),
            beforeSend: () => $('.loading-div').fadeIn(),
            success: (ret) => {
                vm.FecharTodosMensagemAlerta();
                if (!ret.IsSucesso) {
                    vm.ShowMensagemErro(ret.Mensagem);
                    $('.loading-div').fadeOut();
                } else {
                    localStorage.setItem('MostrarMsgModelo', true);

                    if (modeloRD.CodigoModelo === 0) {
                        localStorage.setItem('MsgModelo', 'Modelo adicionado com sucesso!');
                    }
                    else localStorage.setItem('MsgModelo', 'Modelo alterado com sucesso!');

                    mSelf.VoltarPaginaListagemModelos();
                }
            },
            error: (erro) => console.log(erro),
            complete: () => $('.loading-div').fadeOut()
        });
    };

    mSelf.ModeloValido = (modeloRD) => {
        if (!mSelf.ValidarCamposPrincipais(modeloRD)) {
            vm.ShowMensagemAlerta("Por favor, preencha os campos obrigatórios.");
            return false;
        }

        if (!modeloRD.Funcoes || !modeloRD.Funcoes.length) {
            vm.ShowMensagemAlerta("Por favor, selecione ao menos uma função.");
            return false;
        } else if (!modeloRD.Funcoes.map(x => x.ListaAptosFilhos) ||
            !modeloRD.Funcoes.map(x => x.ListaAptosFilhos).length ||
            modeloRD.Funcoes.map(x => x.ListaAptosFilhos).filter(x => !x.length).length) {
            vm.ShowMensagemAlerta("Por favor, selecione um apontamento de modelo para cada função.");
            return false;
        }

        let validado = true;
        modeloRD.Funcoes.forEach(funcao => {
            $(`#ComboFuncao${funcao.Id} .sel-val`).removeClass('linha-vermelha');

            if (!funcao.Posicao) {
                $(`#ComboFuncao${funcao.Id} .sel-val`).addClass('linha-vermelha');
                validado = false;
            }

            funcao.ListaAptosFilhos.forEach(apto => {
                $(`#ComboApontamento${apto.Id} .sel-val`).removeClass('linha-vermelha');

                if (!apto.Posicao) {
                    $(`#ComboApontamento${apto.Id} .sel-val`).addClass('linha-vermelha');
                    validado = false;
                }
            });
        });

        if (!validado) {
            vm.ShowMensagemAlerta("Existem campos não selecionados. Por favor, preencha os campos e tente novamente.");
        }

        return validado;
    };

    mSelf.ValidarCamposPrincipais = (modeloRD) => {
        let validado = true;

        if (!modeloRD.Descricao.trim()) {
            $("#nome-modelo").addClass('linha-vermelha');
            validado = false;
        } else {
            $("#nome-modelo").removeClass('linha-vermelha');
        }

        if (!modeloRD.CodigoOperacao) {
            $("#operacao-modelo").addClass('linha-vermelha');
            validado = false;
        } else {
            $("#operacao-modelo").removeClass('linha-vermelha');
        }

        if (!modeloRD.CodigoMacro) {
            $("#macro-modelo").addClass('linha-vermelha');
            validado = false;
        } else {
            $("#macro-modelo").removeClass('linha-vermelha');
        }

        if (!validado) {
            vm.ShowMensagemAlerta("Por favor, preencha os campos obrigatórios.");
        }

        return validado;
    }

    mSelf.Cancelar = (destino) => {
        const callback = destino === 'listagemModelos' ? mSelf.VoltarPaginaListagemModelos : mSelf.VoltarPaginaInicial;
        vm.Perspectiva.AbrirConfirmacao('Deseja realmente cancelar sem salvar os dados?', callback, null);
    };
}
