﻿import React, { Fragment, memo, useEffect, useRef, useState } from 'react';
import { useHistory, withRouter } from 'react-router-dom';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faReply, faPlus, faPencilAlt, faTrash } from '@fortawesome/free-solid-svg-icons';
import CatalogoCentroCostoInt from './catalogoCentroCostoInt.jsx';
import { SiteRutas } from '../../request/RutasConfig.jsx';

import { useSessionStorage } from '../../components/Util/Hooks/useSessionStorage.jsx';
//utilitarios
import { Notificacion } from '../../components/Util/Notificacion/Notificacion.jsx';
import ModalSpinner from '../../components/UI/modalSpinner/modalSpinner.jsx';
import { datosArbol, validaCorreo, validaTelefono, itemSelect } from '../../components/Util/Util.jsx';
import { CentroCosto_Lista_CCC_Request, Catalogo_Consulta_Request,CatalogoCentroCosto_EliminarCC_Request } from "../../request/ServicioRequest.jsx";
import {  CatalogoXCentroCosto_Eliminar_Request, Catalogo_AsociarCuenta_CentroCostoSP_Request,HayAsientosCentroCosto_Request } from "../../request/MantenimientosRequest.jsx"
import { manageError } from '../../components/Util/ManageError.js';

//Seguridad
import Session from '../../components/Util/session/index.jsx';
import Config from '../../components/Util/constantes.js';
import { Empresa_Consulta_Request } from "../../request/SeguridadRequest.jsx"
import { Obtener_MenuOpciones_Lista_Request, Obtener_MenuNombre_Request } from "../../request/MenuRequest.jsx"
import ModalSeguridad from "../Seguridad/ModalSeguridad.jsx";
import optSeg from '../../components/Util/seg-menu-opciones.js';

import Swal from 'sweetalert2';




const catalogoCentroCosto = (props) => {

   
	const listaCampos = {
		BotonesAE: { value: 0.0, attributes: { readOnly: false, focus: false, label: '', float: 'right', hidden: 'unset' } },
	}
	const [datos, setDatos] = useState(listaCampos);
	let historyMenu = useHistory();
	const [token, setToken] = useSessionStorage('tokenCON', '');
	const [empresa, setEmpresa] = useSessionStorage('empresaCON', 0);
	const [empresaNombreCON, setEmpresaNombreCON] = useSessionStorage('empresaNombreCON', 'ND')
	const [usuario, setUsuario] = useSessionStorage('usuarioCON');
	const mounted = useRef();
	const [spinnerModal, setSpinnerModal] = useState(undefined);
	const [spinnerLabel, setSpinnerLabel] = useState('');
	const [spinnerTipo, setSpinnerTipo] = useState(1);
	const botones = [
		{
			name: "btnHomeC",
			clase: "btn btn-sm pull-right flipInX animated",
			evento: () => volverAtras(),
			leyenda: "",
			iclase: faReply,
			tooltip: "Volver"
		},
		{
			name: "btnModificarC",
			clase: "btn btn-sm pull-right flipInX animated",
			evento: () => actualizarDatos(),
			leyenda: "",
			iclase: faPencilAlt,//"fa fa-pencil",
			tooltip: "Modificar"
		},
		{
			name: "btnNuevoC",
			clase: "btn btn-sm pull-right flipInX animated",
			evento: () => ingresarDatos(),
			leyenda: "",
			iclase: faPlus,//"fa fa-plus",
			tooltip: "Agregar nuevo"
		},
		{
			name: "btnDeleteC",
			clase: "btn btn-sm pull-right flipInX animated",
			evento: () => handleBorrar(),
			leyenda: "",
			iclase: faTrash,
			tooltip: "Eliminar"
		},
	]
	const botonesLista = [
		{
			name: "btnSubTipos",
			clase: "btn btn-sm pull-right flipInX animated",
			evento: () => actualizarDatosReasiganacion(),
			leyenda: "Reasignación",
			iclase: null,
			tooltip: "Reasignación Centro Costo"
		}
	]

    const [listCentroCosto,setListCentroCosto] =useState([]);
    const [listCC, setListCC] = useState([]);
	const [selectedCentroC, setSelectedCentroC] = useState(undefined);    


	//Seguridad
	const [usuarioS, setUsuarioS] = useSessionStorage('UsuarioSCON');
	const [menuId, setMenuId] = useState(0);
	const [menuOpciones, setMenuOpciones] = useState([]);
	const [showModalSeguridad, setShowModalSeguridad] = useState(false);
	const [opcionValidar, setOpcionValidar] = useState(0);
	const [opcionValidarNombre, setOpcionValidarNombre] = useState('');

	const spinnerModalMostrar = (pSpinnerModal, pSpinnerLabel, pSpinnerTipo) => {
		setSpinnerModal(pSpinnerModal);
		setSpinnerLabel(pSpinnerLabel);
		setSpinnerTipo(pSpinnerTipo);
	}



    useEffect(() => {

		if (!mounted.current) {
			const carga = async () => {
				await cargarDatos()
			}
			carga();
			mounted.current = true;
		}

	}, [])


	const cargarDatos = async () => {
		let spinnerLabel = 'Cargando datos...';
		spinnerModalMostrar(true, spinnerLabel, 3)

		const _listCentroC = await carga_ListTree();
        setListCentroCosto(_listCentroC);

		const _MenuNomb = await cargarMenuNombre(Config.Modulo, optSeg.TMenuSistema.CatalogodeCentrodeCosto.value);
		let _menuId = 0;

		if (_MenuNomb.ID != undefined) {
			_menuId = _MenuNomb.ID;
		}
		const _UsuarioS = usuarioS;
		let _menuOpciones = null;

		if (_menuId > 0) {
			_menuOpciones = await cargarMenuOpciones(Config.Modulo, _UsuarioS, _menuId);
		}
		setMenuId(_menuId), setMenuOpciones(_menuOpciones)


		spinnerModalMostrar(false, '', 3)
	}


	const volverAtras = () => {
		historyMenu.push(SiteRutas.Asientos);
	}

	const actualizarDatos = async () => {
		
		const _Valido = await validaSeleccionadoAct(false);
		if (_Valido) {
			if (!selectedCentroC.node.value == 0) {
				const idp = 0;
				const idh = selectedCentroC.node.value;
				const idr = 0;
				//validad que no sea padre
				historyMenu.push(`${SiteRutas.MantCatalogoCentroCosto}/${idp}/${idh}/${idr}`);
			} else {
				Notificacion.error('Debe seleccionar un centro costo.');
			}

		} //else {
		//	Notificacion.warning(`Debe seleccionar un centro costo`);
		//}

	};
	

	const actualizarDatosReasiganacion = async () => {
		
		const _Valido = await validaSeleccionadoAct(true);
		if (_Valido) {
			if (!selectedCentroC.node.value == 0) {
				const idp = 0;
				const idh = selectedCentroC.node.value;
				const idr = 1;
				//validad que no sea padre
				historyMenu.push(`${SiteRutas.MantCatalogoCentroCosto}/${idp}/${idh}/${idr}`);
			} else {
				Notificacion.error('Debe seleccionar un centro costo.');
			}

		} //else {
		//	Notificacion.warning(`Debe seleccionar un centro costo`);
		//}

	};

	const validadCentroCostoEnAsientos = async ( pCentroC) => {
		const response = await HayAsientosCentroCosto_Request(token, empresa, pCentroC);
		if (response.Exitoso) {
			return true;
		}
		else {
			Notificacion.error(response.Mensaje);
			return false
		}


	}

	const ingresarDatos = async () => {
		if (!!selectedCentroC) {
			const _CC = listCC.filter(item => item.ID == selectedCentroC.node.value);
			console.debug(`ingresarDatos: ${JSON.stringify(_CC)}`);
			if(_CC.length > 0){ //ver si no esel node empresa
				if(_CC[0].CentroCosto =='0'){
					Notificacion.error(`El centro de costo ${_CC[0].CentroCosto} no se puede modificar.`);
					return false;
				}
			}
			let idp = selectedCentroC.node.value;
			let idh = 0;
			let idr = 1;
			if (selectedCentroC.node.children) {
				historyMenu.push(`${SiteRutas.MantCatalogoCentroCosto}/${idp}/${idh}/${idr}`);

			} else {
				//validar si tiene asientos asociados y si no si puede agrargar
				if (!selectedCentroC.node.children) {
					const _ValidoIG = await validadCentroCostoEnAsientos(idp);
						(empresa, idp);
					if (!_ValidoIG) {
						return false;
					}
					historyMenu.push(`${SiteRutas.MantCatalogoCentroCosto}/${idp}/${idh}/${idr}`);
				}

			}

		} else {
			Notificacion.warning(`Debe seleccionar un centro de costos.`);
			return false;
		}
	};



	const handleBorrar = async () => {
		const _Valido =  await validaSeleccionado();
		if (_Valido) {
			const optSegopt = optSeg.TOpciones_Menu;
			let validar = validarMenuOpcion(optSegopt.Eliminar.value);
			if (!validar) {
				await handleBorrarSel();
			}
		}
	}



    const validaSeleccionado = async () => {

		if (selectedCentroC == undefined) {
			Notificacion.error(`Debe seleccionar un centro de costo.`);
			return false;
		}
		if (selectedCentroC.node.children) {

			Notificacion.error('El centro seleccionado tiene centros hijos.');
			return false;
		}

		const _CC = listCC.filter(item => item.ID == selectedCentroC.node.value);
		if(_CC[0].CentroCosto =='0'){
			Notificacion.error(`El centro de costo ${_CC[0].CentroCosto} no se puede eliminar.`);
			return false;
		}
		const _ValidoB = await validadCentroCostoEnAsientos( selectedCentroC.node.value);
		if (!_ValidoB) {
			return false;
		}		
		return true;
	}


	const validaSeleccionadoAct = async (pReasignacion) => {

		if (selectedCentroC == undefined) {
			Notificacion.error(`Debe seleccionar un centro de costo.`);
			return false;
		}
		if (!pReasignacion) {
			if (selectedCentroC.node.children) {

				Notificacion.error('El centro de costo seleccionado tiene centros de costo hijos.');
				return false;
			}
		}
		if (pReasignacion) {
			if (!selectedCentroC.node.children) {

				Notificacion.error('El centro de costa seleccionado no tiene centros de costo hijos.');
				return false;
			}
		}

		const _CC = listCC.filter(item => item.ID == selectedCentroC.node.value);
		if (_CC[0].CentroCosto == '0') {
			Notificacion.error(`El centro de costo ${_CC[0].CentroCosto} no se puede modificar.`);
			return false;
		}

		return true;
	}

    const carga_ListTree = async () => {

        const response = await CentroCosto_Lista_CCC_Request(token, empresa);
        let _lista = [];
        if (response.Exitoso) {
            const _listCC = response.Datos;
            const _listCentroC = llenadoListaArbol(_listCC);
            _lista = datosArbol(_listCentroC);
            setListCC(_listCC);
        }
        else {
            const _login = manageError(response, props, '');
            spinnerModalMostrar(false, '', 3);
            if (!_login) { volverAtras(); }
            return false;
        }

        return _lista;

    }
    const llenadoListaArbol = (pLista) => {
        let _Datos = [];
        const _Lista = pLista;
        _Datos.push({ "title": empresaNombreCON, "subtitle": "", "padre": -1, "value": 0 });

        _Lista.map(function (item, index) {
            _Datos.push({ "title": item.CentroCosto + " " + item.Nombre, "subtitle": "", "padre": (item.Padres.length > 0 ? parseInt(item.Padres.substring(item.Padres.length - 6, item.Padres.length)) : 0), "value": item.ID });
        });

        return _Datos;
    }

	const onRowSelectBusquedaTree = async (row, id) => {
			setSelectedCentroC(row);
	}



    const handleBorrarSel = () => {
        let resultado = false;

        if (validaSeleccionado()) {

            Swal.fire({
                title: 'Eliminar Centro de Costo',
                html: '<h4>¿Está seguro que desea eliminar el centro de costo"?</h4>',
                type: 'question',
                showCancelButton: true,
                confirmButtonColor: '#10a599',
                cancelButtonColor: '#d33',
                confirmButtonText: '<h5><i class="fa fa-check fa-fw"></i> Sí</h5>',
                cancelButtonText: '<h5><i class="fa fa-remove fa-fw"></i> No</h5>',
                reverseButtons: true,
                allowOutsideClick: false,
            }).then((result) => {
                if (result.value) {
                    resultado = true;
                    borrarDatos();
                } else if (result.dismiss === Swal.DismissReason.cancel) {
                    resultado = false;
                }
            })

        }

        return resultado;
    }


    const borrarDatos = async () => {
        let _id = selectedCentroC.node.value;
        let resultado = '';
        spinnerModalMostrar(true, 'Eliminando', 3);
        resultado = await CatalogoCentroCosto_EliminarCC_Request(token, empresa, _id, usuario);
        if (resultado.Exitoso) {
            Notificacion.success(`Se eliminó con éxito.`);
            await cargarDatos();                

        }
        else {
            Notificacion.error(`Error: ${resultado.Mensaje}`);
        }

        spinnerModalMostrar(false, '', 3);

    }

        //Seguridad
        const cargarMenuOpciones = async (pModuloId, pUsuarioId, pMenuId) => {
            try {
    
                let listMO = await Obtener_MenuOpciones_Lista_Request(token, pModuloId, pUsuarioId, pMenuId);
                if (listMO.Exitoso === false) {
                    return null;
                }
                return listMO.Datos;
            }
            catch (err) {
                Notificacion.error(`Error: cargarMenuOpciones.`);
            }
        }
    
        const cargarMenuNombre = async (pModulo, pMenuNombre) => {
            try {
                let listMON = await Obtener_MenuNombre_Request(token, pModulo, pMenuNombre);
                if (listMON.Exitoso == false) {
                    return null;
                }
                return listMON.Datos;
            }
            catch (err) {
                Notificacion.error(`Error: cargarMenuNombre.`);
            }
        }
    
        const validarMenuOpcion = (pOpcion) => {
            let validar = false;
            let _menuOpciones = menuOpciones;
            const optSegopt = optSeg.TOpciones_Menu;
            let resultado = _menuOpciones.filter((item) => item.Opcion_Nombre == pOpcion);
            if (resultado.length > 0) {
                if (resultado[0].Opcion_Validar) {
                    setShowModalSeguridad(true); setOpcionValidar(resultado[0].Opcion_Id); setOpcionValidarNombre(pOpcion);
                    validar = true;
                }
            } else {
                setShowModalSeguridad(true); setOpcionValidar(resultado[0].Opcion_Id); setOpcionValidarNombre(pOpcion);
                validar = true;
                //Notificacion.error('No existe opción en la seguridad');
            }
            return validar;
        };
    
        const handleCerrarModal = () => setShowModalSeguridad(false);
    
        const onActionResultModal = (pValido) => {
            if (pValido) {
                let _OpcionNom = opcionValidarNombre;
                setShowModalSeguridad(false); setOpcionValidar(0); setOpcionValidarNombre('');
                const _optSegopt = optSeg.TOpciones_Menu;
                switch (_OpcionNom) {
                    case _optSegopt.GuardarCentroCosto.value:
                        ingresarDatosSel();
                        break;
                    case _optSegopt.Eliminar.value:
                        handleBorrarSel();
                        break;
                    default:
                        break;
                }
            }
        }


    return (
        <Fragment>
            <CatalogoCentroCostoInt
                botones={botones}
                botonesLista={botonesLista}                
                Titulo={'Catálogo Centro de Costos'}
                Datos={datos}
                onRowSelectBusquedaTree={onRowSelectBusquedaTree}
                listCentroCosto={listCentroCosto}

            />
            <ModalSpinner
                selectedModal={spinnerModal}
                contentLabel={'spinnerModalProgress'}
                label={spinnerLabel}
                tipoSpinner={spinnerTipo}
            />
            <ModalSeguridad
                //token={this.props.token}
                modalTitle={'Requiere Permisos'}
                menuId={menuId}
                opcionId={opcionValidar}
                show={showModalSeguridad}
                onActionResult={onActionResultModal}
                onHide={handleCerrarModal}
            />
            </Fragment>
    );
};
export default withRouter(memo(catalogoCentroCosto));