<?php namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;
use App\Http\Controllers\ApiControllerV1;
use stdClass;
use Session;
use Request;

class TruliooController extends Controller {

  private function obtenerSesion($cuit, $apikey){

    $usuario        = Session::get('usuario');
    $user_id        = $usuario->user_id;
    //SQLConnection::consumirServicio($user_id, $cuit,$usuario->producto);
    ApiControllerV1::consumir_servicio($cuit,$usuario->producto); 

    $client_id      = $usuario->cliente['client_id'];
    $secciones      = $this->obtenerSeccionesHabilitadas($user_id,$apikey);
    $usuario->cliente[ENV('INFORME_API')]             = new stdClass;
    $secciones = array_change_key_case($secciones, CASE_LOWER);
    $usuario->cliente[ENV('INFORME_API')]->secciones  = $secciones;
    $usuario->cliente[ENV('INFORME_API')]->client_id  = $client_id;
    Session::put('usuario',$usuario);
    Session::save();
    return true;
  }

  private function obtenerSeccionesHabilitadas($user_id,$apikey){
    if($user_id == '673762136' || $apikey = 'E6AF0CC45EB1D3CE'){
      $secciones_habilitadas  = SQLConnection::obtenerSeccionesHabilitadasInforme($user_id,ENV('INFORME_API'));
    }else{
      $secciones_habilitadas  = SQLConnection::obtenerSeccionesHabilitadasInforme($user_id,ENV('ID_INFORME_COMERCIAL'));
    }

    $secciones_habilitadas_ordenadas = [];
    foreach($secciones_habilitadas as $secciones){
      $secciones_habilitadas_ordenadas[$secciones->nombre_seccion] = $secciones; 
    }
    return $secciones_habilitadas_ordenadas;
  }

  public function validarRequest() {
    $isvalid = false;
    $trulio_request = [];
    $apikey                             = $_POST[strtolower("apikey")] ?? '';

    foreach($_POST as $key =>$value ){
    $trulio_request[strtolower($key)] = $_POST[$key] ?? '';
    }
    $error = [];
    $error["ErrorMessages"] = [];

    if(empty($trulio_request["taxid"]) || !Misc::esCuitArgentino($trulio_request["taxid"]) || $trulio_request["taxid"][0] != 2) {
      $error["ErrorMessages"][] = "The taxid is empty or invalid";
    }
    if(empty($trulio_request["firstname"]) && empty($trulio_request["surname"]) 
    || (strlen(Misc::limpiarString($trulio_request["firstname"])) != strlen($trulio_request["firstname"]))
    || (strlen(Misc::limpiarString($trulio_request["surname"])) != strlen($trulio_request["surname"]))) {
      
      $error["ErrorMessages"][] = "The firstname and surname are empty or have invalid characters";
    }
    /*
    if(($trulio_request["gender"] !== "M") && ($trulio_request["gender"] !== "F")) {
      $error["ErrorMessages"][] = "The gender is empty or has an invalid character";
    }
    if(empty($trulio_request["streetaddress"])) {
      $error["ErrorMessages"][] = "The streetaddress is empty";
    }
    if((empty($trulio_request["zipcode"])) 
    || (strlen(Misc::limpiarString($trulio_request["zipcode"])) != strlen($trulio_request["zipcode"]))) {
      $error["ErrorMessages"][] = "The zipcode is empty or invalid";
    }    
    if((empty($trulio_request["dateofbirth"])) 
    || (strlen($trulio_request["dateofbirth"]) != 10)
    || (!Misc::convertirFormatoFecha($trulio_request["dateofbirth"], "Y-m-d", "d-m-Y"))) {
      $error["ErrorMessages"][] = "The dateofbirth is empty or invalid";
    }
*/
    if ((sizeof($error["ErrorMessages"]) == 0) && ($this->obtenerSesion($trulio_request["taxid"], $apikey))) {
      $isvalid = true;
    }
    return array(
      "obj" => $trulio_request,
      "isvalid" => $isvalid,
      "errors" => $error,
    );
  }
  /*
  public function generarRespuesta() {
    $request = $this->validarRequest();

    $trulio_request = [];
    $trulio_request["firstname"]      = $request["obj"]["firstname"];
    $trulio_request["surname"]        = $request["obj"]["surname"];
    $trulio_request["gender"]         = $request["obj"]["gender"];
    $trulio_request["streetaddress"]  = $request["obj"]["streetaddress"];
    $trulio_request["zipcode"]        = $request["obj"]["zipcode"];
    $trulio_request["dateofbirth"]    = $request["obj"]["dateofbirth"];
    $trulio_request["taxid"]       = $request["obj"]["taxid"];

    if ($request["isvalid"]) {
      if(ENV('SERVICIOS_AFIP') == true) {
        AFIPController::obtenerPadron($trulio_request["taxid"]);
      }

      $sql = SQLConnection::backendStoreProcedure('trulioo_obtener_datos_cuit', array($trulio_request["taxid"]), true);
    }

    $info = [];
    $info["WSFidelitas"]["Trulioo"]["TruliooRequest"] = $trulio_request;
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"] = [];
    
    $item = [];
    $item["-id"] = "AFIP";
    $item["firstname"] = false;
    $item["surname"] = false;
    $item["gender"] = false;
    $item["streetaddress"] = false;
    $item["zipcode"] = false;
    $item["dateofbirth"] = false;
    $item["taxid"] = false;

    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][] = $item;
    $item["-id"] = "BCRA";
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][] = $item;
    $item["-id"] = "OTHER_SOURCES";
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][] = $item;

    if (!empty($sql)) {
      foreach ($info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"] as $pos => $item) {
        $item["firstname"] = (isset($sql->nombre_completo) && ($sql->nombre_completo == $trulio_request["firstname"] . " " . $trulio_request["surname"]));
        $item["surname"] = $item["firstname"];
        $item["gender"] = (isset($sql->genero) && ($sql->genero == $trulio_request["gender"]));
        $item["streetaddress"] = (isset($sql->domicilio) && ($sql->domicilio == $trulio_request["streetaddress"]));
        $item["zipcode"] = (isset($sql->zip) && ($sql->zip == $trulio_request["zipcode"]));
        $item["dateofbirth"] = (isset($sql->fecha_nac) && ($sql->fecha_nac == $trulio_request["dateofbirth"]));
        $item["taxid"] = true;
        $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][$pos] = $item;
      }
    }

    $now = (new \DateTime('NOW'));

    $global_data = [];
    $global_data["Financial"]["Status"] = $sql->financial_status ?? null;
    $global_data["RequestDate"]         = $sql->request_date ?? null;
    $global_data["TransactionID"]       = $sql->transaction_id ?? null;
    $global_data["TransactionStatus"]   = (bool)($sql->transaction_status ?? false);
    $global_data["Period"]["Year"]      = $sql->period_year ?? null;
    $global_data["Period"]["Month"]     = $sql->period_month ?? null;
    $global_data["PeriodCount"]         = $sql->period_count ?? null;

    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["GlobalResponseData"] = $global_data;
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["Errors"]["Error"]             = !$request["isvalid"];
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["Errors"]["Messages"]      = $request["errors"]["ErrorMessages"];

    return response()->json($info);
  }
*/

  public function generarRespuesta() {
    $request = $this->validarRequest();
    $trulio_request = [];
/*@FirstName     VARCHAR(100),
@SurName       VARCHAR(100),
@Gender        VARCHAR(1),
@StreetAddress VARCHAR(250),
@ZipCode       VARCHAR(20),
@DateOfBirth   DATE,
@IDNumber      VARCHAR(20)*/

    $trulio_request[]      = $request["obj"]["firstname"];
    $trulio_request[]        = $request["obj"]["surname"];
    $trulio_request[]          = $request["obj"]["taxid"];
   /* $trulio_request[]         = $request["obj"]["gender"];
    $trulio_request[]  = $request["obj"]["streetaddress"];
    $trulio_request[]        = $request["obj"]["zipcode"];
    $trulio_request[]    = $request["obj"]["dateofbirth"];
*/
    if ($request["isvalid"]) {
      if(ENV('SERVICIOS_AFIP') == true) {
        AFIPController::obtenerPadron($trulio_request[2],true);
      }
      $sql = SQLConnection::backendStoreProcedure('trulioo_validacion', $trulio_request, "selectOne");
    }

    $info = [];
    $info["WSFidelitas"]["Trulioo"]["TruliooRequest"] = $trulio_request;
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"] = [];
    
    $item = [];
    $item["-id"] = "AFIP";


    $item["firstname"]      = $sql->error_Name ?? 'false'; 
    $item["surname"]        = $sql->error_Name ?? 'false';
    $item["taxid"]          = $sql->error_IDNumber ?? 'false';
    $item["gender"]         = $sql->error_Gender ?? 'false';
    $item["streetaddress"]  = $sql->error_Address ?? 'false';
    $item["zipcode"]        = $sql->error_Zipcode ?? 'false';
    $item["dateofbirth"]    = $sql->error_DateOfBirth ?? 'false';


    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][] = $item;
    $item["-id"] = "BCRA";
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][] = $item;
    $item["-id"] = "OTHER_SOURCES";
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["item"][] = $item;

    $now = (new \DateTime('NOW'));

    $global_data = [];
    $global_data["Financial"]["Status"] = $sql->financial_status ?? null;
    $global_data["RequestDate"]         = $sql->request_date ?? null;
    $global_data["TransactionID"]       = $sql->transaction_id ?? null;
    $global_data["TransactionStatus"]   = (bool)($sql->transaction_status ?? false);
    $global_data["Period"]["Year"]      = $sql->period_year ?? null;
    $global_data["Period"]["Month"]     = $sql->period_month ?? null;
    $global_data["PeriodCount"]         = $sql->period_count ?? null;

    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["GlobalResponseData"] = $global_data;
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["Errors"]["Error"]             = !$request["isvalid"];
    $info["WSFidelitas"]["Trulioo"]["FidelitasResponse"]["Errors"]["Messages"]      = $request["errors"]["ErrorMessages"];

    return response()->json($info);
  }



}