<?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:
*/
 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);
    $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'=>[]
          ]);

      }
      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)) 
       {
          $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; 
        ApiControllerV1::consumir_servicio($cuit,$producto); 
        
        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->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 = '';
        $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();    
  }

}



