<?php namespace App\Http\Controllers;

use App\Http\Controllers\MainController;
use App\Http\Controllers\ApiControllerV1;
use App\Custom\Mailer;
use App\Custom\Misc;
use App\Custom\SQLConnection;
use Request;
use Session;
use DB;
use DateTime;

class RenaperController extends Controller  {

/*
//DEPRECADO
  public static function obtenerUltimoEjemplarBatch(){
    $nombre_fuente = Request::input('nombre_fuente');
    if(!$nombre_fuente){
      return 'error, debe setear un nombre de fuente.';
    }
    $listado = SqlConnection::backendStoreProcedure('RENAPER_OBTENER',array($nombre_fuente));
    $options=array(
      'soap_version'   => SOAP_1_1,
      'trace' => true,
      'cache_wsdl' => WSDL_CACHE_NONE,
      'exceptions' => 1,
      'encoding' => 'UTF-8',  
      'stream_context'=>stream_context_create(
        array(
          'ssl'=>array(
            'verify_peer'=>false
            ,'allow_self_signed'=>false
            ,'cafile'=>'../renaper_certificados/cert.crt.pem'
            ,'verify_depth'=>5
            )
        )
      ), 
      'local_cert' => '../renaper_certificados/Fidelitas_DATOSC.pem',
      'passphrase' => 'renaper16',     
        );

    $client = new \SoapClient("https://renaperdatosc.idear.gov.ar:8446/DATOSCYNAC.php?wsdl", $options);
    foreach ($listado as $key => $value) {
      if($value->sexo == null){
        $value->sexo = 'M';
      }
      $respuesta = $client->obtenerUltimoEjemplar(array('dni'=>$value->cuerpo_clave,'sexo'=>$value->sexo));
      SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',array(
      $respuesta->ID_TRAMITE_PRINCIPAL,$respuesta->ID_TRAMITE_TARJETA_REIMPRESA,$respuesta->EJEMPLAR,$respuesta->VENCIMIENTO,$respuesta->EMISION,$respuesta->apellido,$respuesta->nombres,$respuesta->fechaNacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->cpostal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigoError,$respuesta->codigof,$respuesta->mensaf,$respuesta->origenf,$respuesta->fechaf,$respuesta->idciudadano,$respuesta->nacionalidad,$respuesta->lugar_nacimiento,$respuesta->nroError,$respuesta->descripcionError,$value->identificacion,$value->sexo,$value->cuerpo_clave));
        usleep(6000000);
      if($respuesta->nroError == 4 || $respuesta->nroError == 2){
        if($value->sexo == 'M'){
          $value->sexo = 'F';
        }else{
          $value->sexo = 'M';
        }
        $respuesta = $client->obtenerUltimoEjemplar(array('dni'=>$value->cuerpo_clave,'sexo'=>$value->sexo));
        SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',array(
        $respuesta->ID_TRAMITE_PRINCIPAL,$respuesta->ID_TRAMITE_TARJETA_REIMPRESA,$respuesta->EJEMPLAR,$respuesta->VENCIMIENTO,$respuesta->EMISION,$respuesta->apellido,$respuesta->nombres,$respuesta->fechaNacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->cpostal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigoError,$respuesta->codigof,$respuesta->mensaf,$respuesta->origenf,$respuesta->fechaf,$respuesta->idciudadano,$respuesta->nacionalidad,$respuesta->lugar_nacimiento,$respuesta->nroError,$respuesta->descripcionError,$value->identificacion,$value->sexo,$value->cuerpo_clave));
        usleep(6000000);
      }
    }
  }
  */


  /* ANTERIOR a Agosto 2020
  //Este servicio busca de a 1.
  public static function obtenerUltimoEjemplarUno(){
    $dni  = Request::input('dni');
    $sexo = Request::input('sexo');
    $usuario    	= Session::get('usuario');
    $user_id    	= $usuario->user_id;
    $client_id   	= $usuario->cliente['client_id'];
  	SQLConnection::consumirServicio($user_id,$client_id,68);

    $respuesta = [];
    if(!$sexo){
      return json_encode([
        'Status'=>'ERROR','Message'=>'El campo sexo no puede estar vacío','Response'=>[]
        ]);
    }
    if(!$dni){
      return json_encode([
        'Status'=>'ERROR','Message'=>'El campo dni no puede estar vacío','Response'=>[]
        ]);
    }
    if(strlen($dni) != 8){
      return json_encode([
        'Status'=>'ERROR','Message'=>'El campo dni debe tener exactamente 8 números','Response'=>[]
        ]);
    }
    $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR',array($dni,$sexo),'selectOne');
    if(!empty($respuesta)){
      if(trim($respuesta->nombres) == '' && trim($respuesta->nacionalidad) == '' ){
        return json_encode([
          'Status'=>'NE','Message'=>'NO ENCONTRADO','Response'=>[]
          ]);

      }
      return json_encode([
        'Status'=>'OK','Message'=>'OK','Response'=>$respuesta
        ]);
    }
    
      // Agregado 6/8/2020, porque nos da error la conexion con el Renaper 
    
        return json_encode([
        'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
        ]);
    

    $options=array(
      'soap_version'   => SOAP_1_1,
      'trace' => true,
      'cache_wsdl' => WSDL_CACHE_NONE,
      'exceptions' => 1,
      'encoding' => 'UTF-8',  
      'stream_context'=>stream_context_create(
        array(
          'ssl'=>array(
            'verify_peer'=>false
            ,'allow_self_signed'=>false
            ,'cafile'=>'../renaper_certificados/cert.crt.pem'
            ,'verify_depth'=>5
            )
        )
      ), 
      'local_cert' => '../renaper_certificados/Fidelitas_DATOSC.pem',
      'passphrase' => 'renaper16',     
        );

      var_dump('Aca'); die(); 
      $client = new \SoapClient("https://renaperdatosc.idear.gov.ar:8446/DATOSCYNAC.php?wsdl", $options);
      $respuesta = $client->obtenerUltimoEjemplar(array('dni'=>$dni,'sexo'=>$sexo));
      SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',array(
      $respuesta->ID_TRAMITE_PRINCIPAL,$respuesta->ID_TRAMITE_TARJETA_REIMPRESA,$respuesta->EJEMPLAR,$respuesta->VENCIMIENTO,$respuesta->EMISION,$respuesta->apellido,$respuesta->nombres,$respuesta->fechaNacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->cpostal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigoError,$respuesta->codigof,$respuesta->mensaf,$respuesta->origenf,$respuesta->fechaf,$respuesta->idciudadano,$respuesta->nacionalidad,$respuesta->lugar_nacimiento,$respuesta->nroError,$respuesta->descripcionError,'---',$sexo,$dni));
      $resp = new \stdClass();
      if(!empty($respuesta)){
        $resp->apellido = $respuesta->apellido;
        $resp->nombres = $respuesta->nombres;
        $resp->fechaNacimiento = $respuesta->fechaNacimiento;
        $resp->mensaf = $respuesta->mensaf;
        $resp->fechaf = $respuesta->fechaf;
        $resp->nacionalidad = $respuesta->nacionalidad;
        $resp->lugar_nacimiento = $respuesta->lugar_nacimiento;
        if(trim($resp->nombres) == '' && trim($resp->nacionalidad) == '' ){
          return json_encode([
            'Status'=>'NE','Message'=>'NO ENCONTRADO','Response'=>[]
            ]);

        }
          return json_encode([
            'Status'=>'OK','Message'=>'OK','Response'=>$resp
            ]);

      }
      
    return json_encode($respuesta);
  }
  */

/* De aca para abajo es de Agosto 2020, cuando Renaper cambió su servicio, 
   ahora requiere pedir token que dura hasta las 23:59:59 del día solicitado, 
   y después se consulta con dni y sexo, usando ese token. 
   Cambiaron un poco los datos que devuelven:
*/
/*
23/07/2021: se le agregan parametros para poder llamado internamente
*/
 public static function obtenerUltimoEjemplarUno($dni=null, $sexo=null,$llamada_interna = 0){
    if ($llamada_interna == 0){
      $dni  = Request::input('dni');
      $sexo = Request::input('sexo');
      $usuario      = Session::get('usuario');
      $user_id      = $usuario->user_id;
      $client_id    = $usuario->cliente['client_id'];
      //SQLConnection::consumirServicio($user_id,$client_id,68);
      $producto       = $usuario->producto ?? 70;
      //ApiControllerV1::consumir_servicio($dni,$producto); 
  
      $respuesta = [];
      if(!$sexo || !$dni || strlen($dni) != 8)
      {
        ApiControllerV1::consumir_servicio($dni,$producto); 
      }

      if(!$sexo){
        return json_encode([
          'Status'=>'ERROR','Message'=>'El campo sexo no puede estar vacío','Response'=>[]
          ]);
      }
      if(!$dni){
        return json_encode([
          'Status'=>'ERROR','Message'=>'El campo dni no puede estar vacío','Response'=>[]
          ]);
      }
      if(strlen($dni) != 8){
        return json_encode([
          'Status'=>'ERROR','Message'=>'El campo dni debe tener exactamente 8 números','Response'=>[]
          ]);
      }
    }

    $respuesta = SqlConnection::backendStoreProcedure('RENAPER_BUSCAR',array($dni,$sexo),'selectOne');
    if(!empty($respuesta)){
      if(trim($respuesta->nombres) == '' && trim($respuesta->nacionalidad) == '' ){
        return json_encode([
          'Status'=>'NE','Message'=>'NO ENCONTRADO','Response'=>[]
          ]);

      }
      $cuit = $respuesta->cuil ?? $dni; 
      if ($llamada_interna == 0){
          ApiControllerV1::consumir_servicio($cuit,$producto); 
      }

      return json_encode([
        'Status'=>'OK','Message'=>'OK','Response'=>$respuesta
        ]);
    }
    
    $forzar_login = 'N'; 
    $datos = self::obtenerDatosLogin(env('RENAPER_SERVICIO'),$forzar_login);
    if (isset($datos->error)) 
       {
          return json_encode([
          'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
          ]);
       } 
    if (isset($datos->token)) 
    {
      $respuesta = self::obtenerDatosRenaper($dni,$sexo,$datos->token);
      //echo $datos->token; 
      //echo "\r\nConsulta renaper dni sexo"; 
      //if (isset($respuesta->error)) 
      if (isset(json_decode($respuesta)->error)) 
       {
          self::mail_error('','', $respuesta->error); 
          return json_encode([
          'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
          ]);
       } 
      $respuesta = json_decode($respuesta);
     //var_dump($respuesta); die(); 
      $resp = new \stdClass();
       //var_dump($respuesta); die(); 
      if($respuesta->codigo==12 || $respuesta->codigo==4) 
      {
        $resp = $respuesta->mensaje; 
        return json_encode([
          'Status'=>'ERROR','Message'=>$resp,'Response'=>[]
          ]);
      }
      
      //var_dump($respuesta->fecha_nacimiento); die(); 
      if(!empty($respuesta)){
        /* ANTES 
        SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',array(
      $respuesta->ID_TRAMITE_PRINCIPAL,$respuesta->ID_TRAMITE_TARJETA_REIMPRESA,$respuesta->EJEMPLAR,$respuesta->VENCIMIENTO,$respuesta->EMISION,$respuesta->apellido,$respuesta->nombres,$respuesta->fechaNacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->cpostal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigoError,$respuesta->codigof,$respuesta->mensaf,$respuesta->origenf,$respuesta->fechaf,$respuesta->idciudadano,$respuesta->nacionalidad,$respuesta->lugar_nacimiento,$respuesta->nroError,$respuesta->descripcionError,'---',$sexo,$dni));*/


/* Renaper a partir de Agosto 2020, devuelve:
          object(stdClass)#679 (26) {
          ["id_tramite_principal"]=>
          string(7) "8893859"
          ["id_tramite_tarjeta_reimpresa"]=>
          string(7) "8893859"
          ["ejemplar"]=>
          string(1) "A"
          ["vencimiento"]=>
          string(10) "04/06/2025"
          ["emision"]=>
          string(10) "04/06/2010"
          ["apellido"]=>
          string(15) "DE LA VEGA DIAZ"
          ["nombres"]=>
          string(14) "Antonio Amalio"
          ["fecha_nacimiento"]=>
          string(10) "10/07/1926"
          ["cuil"]=>
          string(0) ""
          ["calle"]=>
          string(16) "AV JUAN DE GARAY"
          ["numero"]=>
          string(3) "358"
          ["piso"]=>
          string(0) ""
          ["departamento"]=>
          string(0) ""
          ["codigo_postal"]=>
          string(0) ""
          ["barrio"]=>
          string(1) "0"
          ["monoblock"]=>
          string(0) ""
          ["ciudad"]=>
          string(12) "SIN INFORMAR"
          ["municipio"]=>
          string(22) "CIUDAD DE BUENOS AIRES"
          ["provincia"]=>
          string(22) "CIUDAD DE BUENOS AIRES"
          ["pais"]=>
          string(9) "ARGENTINA"
          ["nacionalidad"]=>
          string(9) "ESPAñOLA"
          ["codigo_fallecido"]=>
          int(1)
          ["mensaje_fallecido"]=>
          string(9) "FALLECIDO"
          ["id_ciudadano"]=>
          string(8) "44834674"
          ["codigo"]=>
          int(99)
          ["mensaje"]=>
          string(15) "DNI/PAS Firmado"
        }

*/
        $cuit = $respuesta->cuil ?? $dni; 
        if ($llamada_interna == 0){
          ApiControllerV1::consumir_servicio($cuit,$producto); 
        }
        if (isset($respuesta->id_tramite_principal))
        {
        SqlConnection::backendStoreProcedure('RENAPER_INSERTAR',
          array($respuesta->id_tramite_principal,$respuesta->id_tramite_tarjeta_reimpresa,$respuesta->ejemplar,$respuesta->vencimiento,$respuesta->emision,$respuesta->apellido,$respuesta->nombres,$respuesta->fecha_nacimiento,$respuesta->cuil,$respuesta->calle,$respuesta->numero,$respuesta->piso,$respuesta->departamento,$respuesta->codigo_postal,$respuesta->barrio,$respuesta->monoblock,$respuesta->ciudad,$respuesta->municipio,$respuesta->provincia,$respuesta->pais,$respuesta->codigo,$respuesta->codigo_fallecido,$respuesta->mensaje_fallecido,'',$respuesta->fecha_fallecimiento ?? '',$respuesta->id_ciudadano,$respuesta->nacionalidad,'','','',$respuesta->cuil,$sexo,$dni));

        }
        $resp->apellido = $respuesta->apellido ?? '';
        $resp->nombres = $respuesta->nombres ?? '';
        $resp->fechaNacimiento = $respuesta->fecha_nacimiento ?? '';
        $resp->mensaf = $respuesta->mensaje_fallecido ?? '';
        $resp->fechaf = $respuesta->fecha_fallecimiento ?? '';
        $resp->nacionalidad = $respuesta->nacionalidad ?? '';
        $resp->lugar_nacimiento = '';
        if(trim($resp->nombres) == '' && trim($resp->nacionalidad) == '' ){
          return json_encode([
            'Status'=>'NE','Message'=>'NO ENCONTRADO','Response'=>[]
            ]);

        }
          return json_encode([
            'Status'=>'OK','Message'=>'OK','Response'=>$resp
            ]);

      }
      
      return json_encode($respuesta);
    }
  }
   
/* -- Login -- */
  private static function obtenerDatosLogin($metodo,$forzar_login){
    
    if($forzar_login=="N")
    {
      $datos =  SQLConnection::backendStoreProcedure('renaper_obtener_datos_login', array(),'selectOne');
    }
    if(!empty($datos) && $forzar_login == "N"){
      session::put($metodo,$datos);
      return $datos;
    }
    else
    {
      $login = self::obtenerLoginRenaper($metodo);
      if ($login==true){
        $datos =  SQLConnection::backendStoreProcedure('renaper_obtener_datos_login', array(),'selectOne');
        session::put($metodo,$datos);
      }
      else 
      {
        $datos = new \stdClass(); 
        $datos->error = "No ha podido establecer la conexion con Renaper"; 
      }
      return $datos;
    }
  }

  private static function obtenerLoginRenaper($metodo){
    $respuesta = self::RenaperCall();
    $resp = json_decode($respuesta); 
    if(isset($resp->token) && isset($resp->codigo) && isset($resp->mensaje)){
      SQLConnection::backendStoreProcedure('Renaper_guardar_autenticacion', array($resp->codigo,$resp->mensaje,$resp->token));
      return true;
    }
    else 
    {
      self::mail_error($resp->response, $resp->err, ''); 
    }
    return false;
  }

  private static function RenaperCall(){
      $curl = curl_init();
      curl_setopt_array($curl, array(
        CURLOPT_URL => env("RENAPER_LOGIN_WSDL"),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => array('username' => env("RENAPER_USERNAME"),'password' => env("RENAPER_PASSWORD")),
      ));

      $response = curl_exec($curl);
      $err = curl_error($curl);
      /*var_dump($response); 
      var_dump($err); die();  */
      curl_close($curl);
      $array=json_decode($response);
      if (sizeof($array)>0)
      {
          foreach ($array as $key => $resp) {
            if($key=='data')
            {
              $codigo = $resp->codigo; 
              $mensaje = $resp->mensaje; 
              $token = $resp->token; 
            }
          }
      }

    if ($err) {
        return json_encode(["error"=>$err]);
    } else {
      $array=json_decode($response);
      if (sizeof($array)>0)
      {
          foreach ($array as $key => $resp) {
            if($key=='data')
            {
              $codigo = $resp->codigo; 
              $mensaje = $resp->mensaje; 
              $token = $resp->token; 
            }
          }
      }
      return json_encode(['codigo'=>$codigo, 'mensaje'=>$mensaje, 'token'=>$token, 'response'=>$response, 'err'=>$err]);
    }
  }

/* -- Fin Login -- */

/* -- Consulta -- */

  private static function obtenerDatosRenaper($dni,$sexo,$token){     
        $curl = curl_init();
        curl_setopt_array($curl, array(
          CURLOPT_URL => "https://apirenaper.idear.gov.ar/apidatos/porDniSexo.php?dni=".$dni."&sexo=".$sexo,
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "GET",
          CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache",
            "postman-token: " . $token 
          ),
        ));

        $authorization = "Authorization: Bearer ". $token; // Prepare the authorisation token
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // Inject the token into the header
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);

        if ($err) {
          return json_encode(["error"=>$err]);
        } else {
          return $response;
        }
  }

/* -- Fin Consulta -- */
 

/* Mail a nosotros, en caso de error */ 
/*
private static function mail_error($response,$err,$error) {
    Mailer::from('soporte@fidelitas.com.ar');
    Mailer::to('soporte@fidelitas.com.ar');
    Mailer::replyto('soporte@fidelitas.com.ar');
    $mail_content = 'Error al consultar Renaper'; 
    $mail_content .= '<br><br>response: ' . $response; 
    $mail_content .= '<br><br>err: '     . $err; 
    $mail_content .= '<br><br>error: '   . $error; 
    $mail_content .= '<br><br>'; 
    $mail_subject = 'Error al consultar Renaper'; 
    Mailer::text($mail_content, $mail_subject);
    return Mailer::send();    
  }
*/
  private static function mail_error($response,$err,$error,$face='') {
    Mailer::from('soporte@fidelitas.com.ar');
    Mailer::to('soporte@fidelitas.com.ar');
    Mailer::replyto('soporte@fidelitas.com.ar');
    $mail_content = 'Error al consultar Renaper ' . $face; 
    $mail_content .= '<br><br>response: ' . $response; 
    $mail_content .= '<br><br>err: '     . $err; 
    $mail_content .= '<br><br>error: '   . $error; 
    $mail_content .= '<br><br>'; 
    $mail_subject = 'Error al consultar Renaper ' . $face; 
    Mailer::text($mail_content, $mail_subject);
    return Mailer::send();    
  }


  
  /* RENAPER - face-match-demo */ 
  public static function obtenerFaceMatchDemo(){
      $apikey       = Request::input('apikey');
      $selfie_image = Request::input('selfie_image');
      $nationalid   = Request::input('nationalid');
      $gender       = Request::input('gender');

      $respuesta = [];
      $respuesta[0] = new \stdClass();
      $respuesta[0]->tcnid = 'TCN-00000000000000'; 
      $respuesta[0]->status = 'HIT';
      $respuesta[0]->score = '91';
      $respuesta[0]->face_match_datetime = '2021-02-08 14:53:22';
      $respuesta[0]->name = 'xxxxxxx';
      $respuesta[0]->surname = 'xxxxxxx';
      $respuesta[0]->nationalid = 'xxxxxxx';
      $respuesta[0]->facematch_id = '0000000';
             
        
      return json_encode([
          'Status'=>'OK','Message'=>'OK','Response'=>$respuesta
          ]);
    }


  /* RENAPER - face-match */ 


public static function obtenerFaceMatch(){

    $selfie_image  = Request::input('selfie_image');
    $nationalid    = Request::input('nationalid');
    $gender        = Request::input('gender');
    $usuario       = Session::get('usuario');
    $user_id       = $usuario->user_id;
    $client_id     = $usuario->cliente['client_id'];
    
    $producto       = $usuario->producto ?? 86;
    
    $sexos = array('M','m','F','f');

    $respuesta = [];

    // En caso de error en los parametros guarda el consumo por lo enviado en nationalID
    if(!$selfie_image || strlen($nationalid) != 8 || !in_array($gender, $sexos))
    {
      ApiControllerV1::consumir_servicio($nationalid,$producto); 
    }

    if(!$selfie_image){
      return json_encode([
        'Status'=>'ERROR','Message'=>'El campo selfie_image no puede estar vacío','Response'=>[]
        ]);
    }
    if(strlen($nationalid) != 8){
      return json_encode([
        'Status'=>'ERROR','Message'=>'El campo nationalid debe tener exactamente 8 números','Response'=>[]
        ]);
    }
    if (!in_array($gender, $sexos)) {
      return json_encode([
        'Status'=>'ERROR','Message'=>'El campo gender debe ser M o F','Response'=>[]
        ]);
    }

    // En caso deno encontrar el documento en padron guarda el consumo por lo enviado en nationalID
    $busca_persona = SqlConnection::backendStoreProcedure('buscar_padron_dni_sexo',array($nationalid, $gender),'selectOne'); 
    if (!$busca_persona) {
       ApiControllerV1::consumir_servicio($nationalid,$producto); 
       return json_encode([
        'Status'=>'ERROR','Message'=>'Combinacion NationalID Gender no encontrado','Response'=>[]
        ]);
    }

    $nombres_persona = $busca_persona->nombres;
    $apellidos_persona = $busca_persona->apellidos;
    $cuit_persona = $busca_persona->identificacion; 

    $forzar_login = 'N'; 
    $datos = self::obtenerDatosLoginFace(env('RENAPER_FACE_SERVICIO'),$forzar_login);
    if (isset($datos->error)) 
       {
          return json_encode([
          'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
          ]);
       } 

    if (isset($datos->token)) 
    {
      $respuesta = self::obtenerDatosRenaperFace($selfie_image,$nationalid,$gender,$datos->token);
      if (isset(json_decode($respuesta)->error)) 
       {
          self::mail_error('','', 'La consulta no puede realizarse en este momento.','Face Match'); 
          return json_encode([
          'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
          ]);
       } 

      $data = json_decode($respuesta)->data;
      if (isset($data->codigo) && $data->codigo !== 200) 
       {
          self::mail_error('',$data->codigo, $data->mensaje,'Face Match 1'); 
          return json_encode([
          'Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[]
          ]);
       } 
    
      $respuesta = json_decode($respuesta);
      $resp = new \stdClass();
      if($respuesta->codigo_http!==200)  // Error especificado en el campo $respuesta->mensaje
      {
        $resp = $respuesta->mensaje_http; 
        return json_encode([
          'Status'=>'ERROR','Message'=>$resp,'Response'=>[]
          ]);
      } 
      $notificacion =  $data->notificacion;
      $errorArray = $notificacion->errorArray; 

      // guardo la consulta con el CUIT, aunque haya consultado por DNI / sexo

      ApiControllerV1::consumir_servicio($cuit_persona,$producto); 
          
      $id = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR',
                                                array($nationalid, 
                                                      $gender, 
                                                      $respuesta->codigo_http??null,
                                                      $respuesta->mensaje_http??null,
                                                      $data->codigo??null, 
                                                      $data->mensaje??null, 
                                                      $notificacion->transactionControlNumber??null, 
                                                      $notificacion->typeOfTransaction??null, 
                                                      $notificacion->dateOfTransaction??null, 
                                                      $errorArray[0]->code??null, 
                                                      $errorArray[0]->description??null, 
                                                      $errorArray[0]->name??null, 
                                                      null),'selectOne');

      if (isset($id->transaccion)) 
      {
          $final = self::obtenerDatosRenaperFaceFinal($id->transaccion,$datos->token);
          if (isset(json_decode($final)->error)) 
           {
              self::mail_error('','', 'La consulta no puede realizarse en este momento.','Face Match 1'); 
              return json_encode([
              'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
              ]);
           } 

          $data = json_decode($final)->data;
          if (isset($data->codigo) && $data->codigo !== 0) 
           {
              self::mail_error('',$data->codigo, $data->mensaje,'Face Match 2'); 
              return json_encode([
              'Status'=>'ERROR','Message'=>$data->mensaje,'Response'=>[]
              ]);
           } 
    
          $respuesta = json_decode($final);
          $resp = new \stdClass();
          if($respuesta->codigo_http!==200)  // Error especificado en el campo $respuesta->mensaje
          {
            $resp = $respuesta->mensaje_http; 
            return json_encode([
              'Status'=>'ERROR','Message'=>$resp,'Response'=>[]
              ]);
          }
          $notificacion =  $data->notificacion;
          $fechor = $notificacion->fechanoti ?? '';
          $fechor .= ' ';
          $fechor .= $notificacion->horanoti ?? ''; 

          $ok = SqlConnection::backendStoreProcedure('RENAPER_FACE_INSERTAR_FINAL',
                                                    array($id->id, 
                                                          $respuesta->codigo_http??null,
                                                          $respuesta->mensaje_http??null,
                                                          $notificacion->TCN??null,
                                                          $notificacion->status??null,
                                                          $notificacion->score??null,
                                                          $notificacion->matchtype??null,
                                                          $notificacion->comments??null,
                                                          $notificacion->fechanoti??null,
                                                          $notificacion->horanoti??null,
                                                          $data->codigo??null,
                                                          $data->mensaje??null
                                                          ),'selectOne');
          $response = [];
          $response[0] = new \stdClass(); 
          $response[0]->tcnid  = $notificacion->TCN       ?? '';
          $response[0]->status = $notificacion->status    ?? '';
          //$response[0]->score  = $notificacion->score     ?? '';

          $score = $notificacion->score ?? '';
          if (is_numeric($score))
          {
            $score = intdiv($score, 100);
            $score = strval($score);
          }
          $response[0]->score  =  $score; 

          $response[0]->face_match_datetime = $fechor     ?? '';
          $response[0]->name         = $nombres_persona   ?? '';
          $response[0]->surname      = $apellidos_persona ?? '';
          $response[0]->nationalid   = $nationalid;
          $response[0]->facematch_id = $id->transaccion; 

          return json_encode([
          'Status'=>'OK','Message'=>'OK','Response'=>$response
          ]);
      }

      else 

      {
          self::mail_error('','', 'La consulta no puede realizarse en este momento.','Face Match 1'); 
          return json_encode([
          'Status'=>'ERROR','Message'=>'La consulta no puede realizarse en este momento.','Response'=>[]
          ]);
      } 
    }


}
   
/* -- Login Face match-- */
  private static function obtenerDatosLoginFace($metodo,$forzar_login){
    
    if($forzar_login=="N")
    {
      $datos =  SQLConnection::backendStoreProcedure('renaper_face_obtener_datos_login', array(),'selectOne');
    }
    if(!empty($datos) && $forzar_login == "N"){
      session::put($metodo,$datos);
      return $datos;
    }
    else
    {
      $login = self::obtenerLoginRenaperFace($metodo);
      if ($login==true){
        $datos =  SQLConnection::backendStoreProcedure('renaper_face_obtener_datos_login', array(),'selectOne');
        session::put($metodo,$datos);
      }
      else 
      {
        $datos = new \stdClass(); 
        $datos->error = "No ha podido establecer la conexion con Renaper"; 
      }
      return $datos;
    }
  }

  private static function obtenerLoginRenaperFace($metodo){

    $respuesta = self::RenaperFaceCall();
    $resp = json_decode($respuesta); 
    if(isset($resp->token) && isset($resp->codigo) && isset($resp->mensaje)){
      $ok = SQLConnection::backendStoreProcedure('Renaper_Face_guardar_autenticacion', array($resp->codigo,$resp->mensaje,$resp->token));
      return true;
    }
    else 
    {
      self::mail_error($resp->response, $resp->err, '','Face match 0'); 
    }
    return false;
  }

  private static function RenaperFaceCall(){
      $curl = curl_init();
      curl_setopt_array($curl, array(
        CURLOPT_URL => env("RENAPER_FACE_LOGIN_WSDL"),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => array('username' => env("RENAPER_FACE_USERNAME"),'password' => env("RENAPER_FACE_PASSWORD")),
      ));

      $response = curl_exec($curl);
      $err = curl_error($curl);
      //var_dump($response); 
      //var_dump($err); die();  
      curl_close($curl);
      $array=json_decode($response);
      if (sizeof($array)>0)
      {
          foreach ($array as $key => $resp) {
            if($key=='data')
            {
              $codigo = $resp->codigo; 
              $mensaje = $resp->mensaje; 
              $token = $resp->token; 
            }
          }
      }

    if ($err) {
        return json_encode(["error"=>$err]);
    } else {
      $array=json_decode($response);
      if (sizeof($array)>0)
      {
          foreach ($array as $key => $resp) {
            if($key=='data')
            {
              $codigo = $resp->codigo; 
              $mensaje = $resp->mensaje; 
              $token = $resp->token; 
            }
          }
      }
      return json_encode(['codigo'=>$codigo, 'mensaje'=>$mensaje, 'token'=>$token, 'response'=>$response, 'err'=>$err]);
    }
  }

/* -- Fin Login Face -- */

/* -- Consulta Parte 1 -- */

  private static function obtenerDatosRenaperFace($selfie,$dni,$sexo,$token){  
        $curl = curl_init();

        curl_setopt_array($curl, array(
        CURLOPT_URL => env("RENAPER_FACE_TCN_WSDL"),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',  
        //CURLOPT_POSTFIELDS => array('imagen' => $selfie,'dni' => $dni, 'sexo' => $sexo),
        CURLOPT_POSTFIELDS =>'{"imagen":"'.$selfie.'","dni":"'.$dni.'","sexo":"'.$sexo.'"}',
        CURLOPT_HTTPHEADER => array(
          'Content-Type: text/plain',
          'Authorization: Bearer '. $token
        ),
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        //var_dump($response);
        //var_dump($err); die(); 

        if ($err) {
          return json_encode(["error"=>$err]);
        } else {
          return $response;
        }
  }

/* -- Consulta Parte 2 -- */

    private static function obtenerDatosRenaperFaceFinal($id,$token){  
        $curl = curl_init();

        curl_setopt_array($curl, array(
          CURLOPT_URL => "https://apirenaper.idear.gov.ar/CHUTROFINAL/API_ABIS/resultadoTCN.php?id=".$id, 
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "GET",
        ));

        $authorization = "Authorization: Bearer ". $token; // Prepare the authorisation token
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain' , $authorization )); // Inject the token into the header



        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        //var_dump($response);
        //var_dump($err); die(); 

        if ($err) {
          return json_encode(["error"=>$err]);
        } else {
          return $response;
        }
  }


public static function renaperLista(){  

  // Los cuits (o dni, sexo) a buscar se cargan en la tabla renaper_cuits, con una fecha determinada
  // Para procesarlos https://www.fidelitas.com.ar/renaper-lista?fecha=aaaa-mm-dd (se pasa como parámetro esa fecha)
  $fecha = Request::input('fecha');
  $registros = DB::select("EXEC renaper_lista_cuit ?,?,? ", array($fecha,'LISTA',null));
  $procesados = 0; 
  $leidos = 0;
  foreach($registros as $key =>$cuits)
  {
    $leidos += 1; 
    if (!empty($cuits->dni) && !empty($cuits->sexo))
    {
    $params = 'dni=' .  $cuits->dni .'&sexo=' . $cuits->sexo . '&apikey=1F44A3FAA0C15C70' ; 
    $html = self::listaCURLCall('https://api.fidelitas.com.ar/v1/nacionalidad/consulta',$params,'POST');

    $update = DB::select("EXEC renaper_lista_cuit ?,?,? ", array($fecha,'UPDATE',$cuits->id));  
    $procesados += 1; 
    usleep(1000000); 
    }
  
  }

  echo ("<br><br>Cantidad de dnis leidos = " . $leidos); 
  echo ("<br><br>Cantidad de dnis procesados = " . $procesados); 

}

public static function listaCURLCall($url,$params,$type="POST"){
    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => $type,
      CURLOPT_POSTFIELDS => $params,
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache",
        "content-type: application/x-www-form-urlencoded"
      ),
    ));

    $response = curl_exec($curl);
    $err      = curl_error($curl);
    curl_close($curl);
/*
    var_dump($response); 
    var_dump($err); 
    die(); 
*/
    if ($err) {
      return json_encode(array('error'=>true));
    } else {
      return $response;
    }
  }








/* -- Fin Consulta -- */
 
  
  




}



