(function () {
    'use strict';
    angular
        .module('setoresApp')
        .factory('edicaoApontamentosFormHelpersFactory', edicaoApontamentosFormHelpersFactory);

    edicaoApontamentosFormHelpersFactory.$inject = ['FormValidation', 'ngNotify', '$timeout', '$q'];

    function edicaoApontamentosFormHelpersFactory(FormValidation, ngNotify, $timeout, $q) {

        function adicionarValidacao(form, formsValidations, formGroupIdx) {
            return $timeout(() => {
                try {
                    let formGroup = form.$$controls[formGroupIdx];
                    let formValidation = new FormValidation(formGroup);
                    formValidation.setControlsValidation(validarGrupoApontamentosEdicao);

                    formsValidations.push(formValidation);
                    return $q.resolve();

                } catch (e) {
                    return $q.reject(e);
                }
            }, 500);
        }

        function removerValidacao(formsValidations, identificadorUnico) {
            return $timeout(() => {
                try {

                    let idx = formsValidations.findIndex((formValidation) =>
                        formValidation.form.$$element.data('uuid').includes(identificadorUnico));

                    formsValidations.splice(idx, 1);

                    return $q.resolve();
                } catch (e) {
                    return $q.reject(e)
                }
            }, 500)
        }

        function redefinirValidacao(formsValidations, identificadorVeiculo) {
            return $timeout(() => {
                try {
                    let formValidation = formsValidations.find(formValidation =>
                        (formValidation.form.$$element.data('uuid') || []).includes(identificadorVeiculo));

                    formValidation.setControlsValidation(validarGrupoApontamentosEdicao);

                    return $q.resolve();
                } catch (e) {
                    return $q.reject(e)
                }
            }, 500);
        }

        function revalidarFormulario(formValidation) {
            if (formValidation.form.$$controls) {
                formValidation.form.$$controls.forEach(item => item.$viewChangeListeners.forEach(func => func()));
            }
        }

        function formatarDadosValidacaoServidor(setorAtual, dados) {
            let envioParaValidacao = {
                CodigoSetor: setorAtual,
                VeiculosColetas: []
            };

            dados.forEach(veiculo => {
                veiculo.viagens.forEach(viagem => {
                    let apontamentoInicio = viagem.apontamentos.find(apontamento => apontamento.tipo === 12);
                    let apontamentoFim = viagem.apontamentos.find(apontamento => apontamento.tipo === 13);

                    let obj = {
                        CodigoVeiculo: veiculo.codigo,
                        DataHoraInicio: apontamentoInicio.data,
                        DataHoraFim: apontamentoFim.data
                    };

                    envioParaValidacao.VeiculosColetas.push(obj);
                })
            });

            return envioParaValidacao;
        }

        function formatarDadosReprocessamentoServidor(setorAtual, data, dados) {
            let envioParaReprocessamento = {
                CodigoSetor: setorAtual,
                DataExecucao: data,
                VeiculosColetas: []
            };

            dados.map(veiculo => {
                veiculo.viagens.forEach(viagem => {
                    let apontamentoInicio = viagem.apontamentos.find(apontamento => apontamento.tipo === 12);
                    let apontamentoFim = viagem.apontamentos.find(apontamento => apontamento.tipo === 13);

                    let obj = {
                        CodigoVeiculo: veiculo.codigo,
                        CodigoSetorRealizado: veiculo.codigoSetorRealizado,
                        CodigoSetor: veiculo.codigoSetor,
                        CodigoApontamentoInicio: apontamentoInicio.codigo,
                        CodigoApontamentoFim: apontamentoFim.codigo,
                        Matricula: veiculo.matriculaMotorista,
                        DataHoraInicio: apontamentoInicio.data,
                        DataHoraFim: apontamentoFim.data
                    };

                    envioParaReprocessamento.VeiculosColetas.push(obj);
                })
            });

            return envioParaReprocessamento;
        }

        function validarGrupoApontamentosEdicao(formObj) {
            let modalNotification = document.getElementById('modalNotificationOuter');

            const inputsInterval = formObj.form.$$controls.filter((item) => {
                if (item.$$attr.interval) return item;
            });

            inputsInterval.reduce((previous, current) => {
                current.customValidation = !((previous && previous.$modelValue) >= current.$modelValue);
                return current;
            });

            if (inputsInterval.find(input => !input.customValidation)) {
                ngNotify.set('A data selecionada deve posterior a data do apontamento anterior', {
                    target: '#modalNotificationOuter', type: 'error', sticky: true, button: false
                });
            } else {
                modalNotification.innerText = '';
            }
        }

        return {
            adicionarValidacao: adicionarValidacao,
            removerValidacao: removerValidacao,
            redefinirValidacao: redefinirValidacao,
            revalidarFormulario: revalidarFormulario,
            formatarDadosValidacaoServidor: formatarDadosValidacaoServidor,
            formatarDadosReprocessamentoServidor: formatarDadosReprocessamentoServidor
        }
    }
})();
