<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;

use App\Custom\Misc;
use App\Custom\SQLConnection;

use App\Http\Controllers\AFIPController;

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 = [];
        /*@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);
    }
}
