<?php namespace App\Http\Controllers;

use Request;
use Session;
use Response;
use App\Custom\Misc;
use App\Custom\SQLConnection;


class DataCleaningController extends Controller
{

    /**
     * Parametros a los servicios
     * de API de Datacleaning (ademas del apikey)
     * @param string Key:identificador -->  el identificador o el tipo de documento de identidad
     * @param string|int Key:identificacion --> la identificacion o el numero de documento de identidad
     * @param string Key:country_code --> el codigo iso2 del pais emisor del documento o documento de identidad recibido
     * @param string Key:nombre_apellido_persona --> nombre completo de la persona asociado al numero de documento de identidad
     * @param string Key:tipo_persona --> una letra que caracteriza el tipo de persona del documento de identidad ('F' (Fisica) o 'J' (Juridica))
     * @param string Key:sexo --> sexo de la persona ('M' (Masculino) o 'F' (Femenino))
     * @param int Key:es_pasaporte --> un campo parecido a bit mandar 1 si el tipo de documento es pasaporte sino ignorarlo o mandar 0
     * @param string Key:tarea --> el id de referencia de terceros, es el id de la tarea de inquiro 
     * lo cual el Informe generado va a ser vinculado con , cuando termine el informe de data cleaning
     * Inquirovitae va a recibir una peticion con ese numero de id indicando que el informe de data cleaning
     * se finalizo.
     */

    /**
	 * Funcion que maneja el
	 * servicio de API para
	 * dar de alta informes de 
	 * data cleaning de juicios
	 * @access public
     * @return Illuminate\Http\JsonResponse
	 */
	public function dclJuicios(){
        // Country Code
        if ( !isset($_POST['country_code']) ){
            return Response::JSON(['error' => '1.1','mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'],400);
        }
        // Nombre Apellido persona
        if ( !isset($_POST['nombre_apellido_persona']) ){
            return Response::JSON(['error' => '1.2','mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'],400);
        }
        // Identificacion
        if ( !isset($_POST['identificacion']) ){
            return Response::JSON(['error' => '1.3','mensaje' => 'La identificacion no esta en los datos recibidos.'],400);
        }
        // Identificador
		if ( !isset($_POST['identificador']) ){
            return Response::JSON(['error' => '1.4','mensaje' => 'El identificador no esta en los datos recibidos.'],400);
        }
        // Referencia
        if ( !isset($_POST['tarea']) ){
            return Response::JSON(['error' => '1.5','mensaje' => 'La referencia no esta en los datos recibidos.'],400);
        }
        // Tipo de Persona
		if ( !isset($_POST['tipo_persona']) ){
            return Response::JSON(['error' => '1.6','mensaje' => 'El tipo de persona no esta en los datos recibidos.'],400);
        }
		//
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        // Parametros
        $tarea = Request::input('tarea');
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $identificador = strtoupper(trim(Request::input('identificador')));
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        // Control de tipo de identificacion
        if ( $tipo_persona == 'F' ){
            // Control de Sexo (si es persona fisica)
		    /* if ( !isset($_POST['sexo']) ){
                return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
            } else {
                $sexo = Request::input('sexo');
            } */
            $sexo = Request::input('sexo');
            if ( !is_null($sexo) ){
                $sexo = strtoupper($sexo);
                if ( $sexo != 'M' && $sexo != 'F' ){
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5','mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'],400);
        }
        // Control Codigo Pais
        if ( strlen($country_code) != 2 ){
            return Response::JSON(['error' => '2.3','mensaje' => 'El codigo de pais recibido es invalido.'],400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if ( is_numeric($nombre_persona) || preg_match($caracteres_invalidos,$nombre_persona) ){
            return Response::JSON(['error' => '2.4','mensaje' => 'El nombre completo recibido es invalido.'],400);
        }
        //
        $id_padron_fide = NULL;
        if ( $es_pasaporte ){
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion,$ident_pasaporte,true);
            if ( !$id_padron_fide ){
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL),'selectOne');
            }
        } elseif ( $identificador == 'CUIL' || $identificador == 'CUIT' ){
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if ( !$es_cuit ){
                return Response::JSON(['error' => '2.1','mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'],400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion,$identificador,true);
            // Si no esta consultar AFIP
            if ( !$id_padron_fide ){
                //
                AFIPController::obtenerPadron($identificacion,true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion,$identificador,true);
                if ( !$id_padron_fide ){
                    return Response::JSON(['error' => '2.2','mensaje' => 'La identificación recibida es invalida.'],400);        
                }
            }
        } else {
            return Response::JSON(['error' => '1.6','mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'],400);
        }
        // Alta del informe de data cleaning de juicios
        // $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('ALTA_INFORME_TERCEROS',$cliente,$user_id,env('ID_INFORME_DCLJUICIOS'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL')),'selectOne');
        $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('CONTRAPARTE_DATACLEAN',$cliente,$user_id,env('ID_INFORME_DCLJUICIOS'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL'),NULL,NULL,env('LED_PRODUCTO'),$id_padron_fide),'selectOne');
        //
        return Response::JSON(['error' => '0','mensaje' => 'El informe de juicios fue creado con exito.','id_informe' => $id_informe->infGenerado]);
	}

	/**
	 * Funcion que maneja el
	 * servicio de API para
	 * dar de alta informes de 
	 * data cleaning de edictos
	 * @access public
     * @return Illuminate\Http\JsonResponse
	 */
	public function dclEdictos(){
        // Country Code
        if ( !isset($_POST['country_code']) ){
            return Response::JSON(['error' => '1.1','mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'],400);
        }
        // Nombre Apellido persona
        if ( !isset($_POST['nombre_apellido_persona']) ){
            return Response::JSON(['error' => '1.2','mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'],400);
        }
		// Identificacion
        if ( !isset($_POST['identificacion']) ){
            return Response::JSON(['error' => '1.1','mensaje' => 'La identificacion no esta en los datos recibidos.'],400);
        }
        // Identificador
		if ( !isset($_POST['identificador']) ){
            return Response::JSON(['error' => '1.2','mensaje' => 'El identificador no esta en los datos recibidos.'],400);
        }
        // Referencia
        if ( !isset($_POST['tarea']) ){
            return Response::JSON(['error' => '1.3','mensaje' => 'La referencia no esta en los datos recibidos.'],400);
        }
        // Tipo de Persona
		if ( !isset($_POST['tipo_persona']) ){
            return Response::JSON(['error' => '1.6','mensaje' => 'El tipo de persona no esta en los datos recibidos.'],400);
        }
		//
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        //
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $tarea = Request::input('tarea');
        $identificador = Request::input('identificador');
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        //
        // Control de tipo de identificacion
        if ( $tipo_persona == 'F' ){
            // Control de Sexo (si es persona fisica)
		    /* if ( !isset($_POST['sexo']) ){
                return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
            } else {
                $sexo = Request::input('sexo');
            } */
            $sexo = Request::input('sexo');
            if ( !is_null($sexo) ){
                $sexo = strtoupper($sexo);
                if ( $sexo != 'M' && $sexo != 'F' ){
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5','mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'],400);
        }
        // Control Codigo Pais
        if ( strlen($country_code) != 2 ){
            return Response::JSON(['error' => '2.3','mensaje' => 'El codigo de pais recibido es invalido.'],400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if ( is_numeric($nombre_persona) || preg_match($caracteres_invalidos,$nombre_persona) ){
            return Response::JSON(['error' => '2.4','mensaje' => 'El nombre completo recibido es invalido.'],400);
        }
        //
        $id_padron_fide = NULL;
        if ( $es_pasaporte ){
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion,$ident_pasaporte,true);
            if ( !$id_padron_fide ){
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL),'selectOne');
            }
        } elseif ( $identificador == 'CUIL' || $identificador == 'CUIT' ){
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if ( !$es_cuit ){
                return Response::JSON(['error' => '2.1','mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'],400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion,$identificador,true);
            // Si no esta consultar AFIP
            if ( !$id_padron_fide ){
                //
                AFIPController::obtenerPadron($identificacion,true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion,$identificador,true);
                if ( !$id_padron_fide ){
                    return Response::JSON(['error' => '2.2','mensaje' => 'La identificación recibida es invalida.'],400);        
                }
            }
        } else {
            return Response::JSON(['error' => '1.6','mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'],400);
        }
        // Alta del informe de data cleaning de boletines
        // $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('ALTA_INFORME_TERCEROS',$cliente,$user_id,env('ID_INFORME_DCLDIRECTORIOS'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL')),'selectOne');
        $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('CONTRAPARTE_DATACLEAN',$cliente,$user_id,env('ID_INFORME_DCLDIRECTORIOS'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL'),NULL,NULL,env('LED_PRODUCTO'),$id_padron_fide),'selectOne');
        //
        return Response::JSON(['error' => '0','mensaje' => 'El informe de edictos fue creado con exito.','id_informe' => $id_informe->infGenerado]);
	}

    /**
	 * Funcion que maneja el
	 * servicio de API para
	 * dar de alta informes de 
	 * data cleaning completo
	 * @access public
     * @return Illuminate\Http\JsonResponse
	 */
	public function dclCompleto(){
        // return Response::JSON(['error' => '3.1','mensaje' => 'El servicio no esta disponible.'],503);
		// Country Code
        if ( !isset($_POST['country_code']) ){
            return Response::JSON(['error' => '1.1','mensaje' => 'El codigo ISO2 del pais no esta en los datos recibidos.'],400);
        }
        // Nombre Apellido persona
        if ( !isset($_POST['nombre_apellido_persona']) ){
            return Response::JSON(['error' => '1.2','mensaje' => 'El nombre completo de la persona no esta en los datos recibidos.'],400);
        }
		// Identificacion
        if ( !isset($_POST['identificacion']) ){
            return Response::JSON(['error' => '1.1','mensaje' => 'La identificacion no esta en los datos recibidos.'],400);
        }
        // Identificador
		if ( !isset($_POST['identificador']) ){
            return Response::JSON(['error' => '1.2','mensaje' => 'El identificador no esta en los datos recibidos.'],400);
        }
        // Referencia
        if ( !isset($_POST['tarea']) ){
            return Response::JSON(['error' => '1.3','mensaje' => 'La referencia no esta en los datos recibidos.'],400);
        }
        // Tipo de Persona
		if ( !isset($_POST['tipo_persona']) ){
            return Response::JSON(['error' => '1.6','mensaje' => 'El tipo de persona no esta en los datos recibidos.'],400);
        }
		//
        $cliente = Session::get('usuario')->cliente['client_id'];
        $user_id = Session::get('usuario')->user_id;
        //
        $country_code = Request::input('country_code');
        $nombre_persona = Request::input('nombre_apellido_persona');
        $tarea = Request::input('tarea');
        $identificador = Request::input('identificador');
        $identificacion = Request::input('identificacion');
        $tipo_persona = strtoupper(Request::input('tipo_persona'));
        $sexo = NULL;
        $es_pasaporte = Request::input('es_pasaporte') ?? 0;
        // Control de tipo de identificacion
        if ( $tipo_persona == 'F' ){
            // Control de Sexo (si es persona fisica)
		    /* if ( !isset($_POST['sexo']) ){
                return Response::JSON(['error' => '2.6','mensaje' => 'El sexo no esta en los datos recibidos.'],400);
            } else {
                $sexo = Request::input('sexo');
            } */
            $sexo = Request::input('sexo');
            if ( !is_null($sexo) ){
                $sexo = strtoupper($sexo);
                if ( $sexo != 'M' && $sexo != 'F' ){
                    $sexo = NULL;
                }
            }
        } else {
            return Response::JSON(['error' => '2.5','mensaje' => 'El tipo de persona recibido es invalido, solamente se procesan pedidos de personas fisicas.'],400);
        }
        // Control Codigo Pais
        if ( strlen($country_code) != 2 ){
            return Response::JSON(['error' => '2.3','mensaje' => 'El codigo de pais recibido es invalido.'],400);
        }
        // Control Nombre Persona
        $caracteres_invalidos = '/!\"#\$%&\/()\=\'\}\{\[\]\,/';
        if ( is_numeric($nombre_persona) || preg_match($caracteres_invalidos,$nombre_persona) ){
            return Response::JSON(['error' => '2.4','mensaje' => 'El nombre completo recibido es invalido.'],400);
        }
        //
        $id_padron_fide = NULL;
        if ( $es_pasaporte ){
            // Buscar en Padron
            $ident_pasaporte = (SQLConnection::obtenerPasaportePais($country_code))->identificador;
            $id_padron_fide = $this->evaluarEnPadron($identificacion,$ident_pasaporte,true);
            if ( !$id_padron_fide ){
                // Si no esta insertar en Padron
                $id_padron_fide = SQLConnection::backendStoreProcedure('backend_insertar_padron', array(trim($ident_pasaporte), trim($identificacion), trim($nombre_persona), $tipo_persona, $sexo, "0", "0", NULL, NULL, NULL, $country_code, NULL, NULL),'selectOne');
            }
        } elseif ( $identificador == 'CUIL' || $identificador == 'CUIT' ){
            // Validar CUIT
            $es_cuit = Misc::validarCuit($identificacion);
            if ( !$es_cuit ){
                return Response::JSON(['error' => '2.1','mensaje' => 'La identificación recibida no tiene una estructura valida de CUIT.'],400);
            }
            // Buscar en Padron
            $id_padron_fide = $this->evaluarEnPadron($identificacion,$identificador,true);
            // Si no esta consultar AFIP
            if ( !$id_padron_fide ){
                //
                AFIPController::obtenerPadron($identificacion,true);
                $id_padron_fide = $this->evaluarEnPadron($identificacion,$identificador,true);
                if ( !$id_padron_fide ){
                    return Response::JSON(['error' => '2.2','mensaje' => 'La identificación recibida es invalida.'],400);        
                }
            }
        } else {
            return Response::JSON(['error' => '1.6','mensaje' => 'El tipo de identificación debe ser CUIT,CUIL o pasaporte.'],400);
        }
        // Alta del informe de data cleaning
        $id_informe = SQLConnection::backendStoreProcedure('LN_blue_terceros',array('CONTRAPARTE_DATACLEAN',$cliente,$user_id,env('ID_INFORME_DCLCOMPLETO'),$identificacion,$identificador,$tarea,env('ID_TEAM_DCL'),NULL,NULL,env('LED_PRODUCTO'),$id_padron_fide),'selectOne');
        //
        return Response::JSON(['error' => '0','mensaje' => 'El informe de data cleaning fue creado con exito.','id_informe' => $id_informe->infGenerado]);
	}

    /**
     * funcion que evalua con
     * el identificador y la identificacion
     * si el registro esta dado de alta
     * @access private
     * @param string el identificacion
     * @param string el tipo de identificacion o identificador
     * @param bool si devuelve los datos o devuelve si existe o no
     * @return bool|object
     */
    private function evaluarEnPadron($identificacion,$identificador,$con_datos=false){
        $datos = SQLConnection::verificarPadron($identificacion,$identificador);
        $id_padron = NULL;
        // si esta vacia la busqueda
        if ( empty($datos) ){
            if ( $con_datos ){
                return $id_padron;
            } else {
                return false;
            }
        } else {
            // si no esta vacia la busqueda
            // Para los CUIT o CUIL evalua para ambos , porque puede ser que es un CUIT pero es informado por el api como CUIL
            // Entonces se busca para los dos
            foreach( $datos as $obj_pad ){
                if ( ($obj_pad->identificador == $identificador) || ( $identificador == 'CUIT' && $obj_pad == 'CUIL' ) || ( $identificador == 'CUIL' && $obj_pad == 'CUIT' ) ){
                    $id_padron = $obj_pad->id_padron;
                    break;
                }
            }
            //
            if ( $con_datos ){
                return $id_padron;
            } else {
                if ( !is_null($id_padron) ){
                    return true;
                } else {
                    return false;
                }
            }
        }
    }
}