<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;
use App\Custom\SQLConnection;
use App\Custom\Misc;
use DateTime;
use Exception;
use stdClass;

class CreditsafeController extends Controller
{
    // Busqueda de parametros por pais al que se va a consultar
    public static function companySearchCriteria(){

        // obtener pais/es
        $countries = Request::input('countries');
        
        if (empty($countries)) {
            return 'No countries received';
        }

        $token = self::checkCreditsafeToken();

        if ($token == false) {
            return 'No token received';
        }

        $url = env('CREDITSAFE_SEARCH_CRITERIA');
        $params = http_build_query([
            "countries" => $countries
        ]);

        $ch = curl_init("{$url}?{$params}");

        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                "Authorization: Bearer {$token}",
                "Accept: application/json"
            ]
        ]);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if (curl_errno($ch)) {
            throw new Exception("cURL error: " . curl_error($ch));
        }

        curl_close($ch);

        if ($httpCode === 200) {
            $data = json_decode($response, true);
            $jsonStr = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            
            return $jsonStr;
        }        
    }

    // Busqueda de informacion de la empresa
    public static function companySearch(){        
        $countries = Request::input('countries');
        $companyName = Request::input('company_name');
        
        if (empty($countries) || empty($companyName)) {
            return 'No parameters received : company_name o countries';
        }
        
        $token = self::checkCreditsafeToken();

        if ($token == false) {
            return 'No token received';
        }

        $url = env('CREDITSAFE_COMPANY');

        $params = http_build_query([
            'countries' => $countries,
            'name' => $companyName
        ]);

        $headers = [
            "Authorization: Bearer $token",
            "Accept: application/json"
        ];

        $curl = curl_init();

        curl_setopt_array($curl, [
            CURLOPT_URL => $url . '?' . $params,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => $headers,
        ]);

        $response = curl_exec($curl);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        if ($httpCode === 200) {
            $data = json_decode($response, true);
            $empresas = $data['companies'] ?? [];
            $jsonStr = json_encode($empresas, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            return $jsonStr;
        } 

        curl_close($curl);

    }

    // Funcion que se encarga de obtener el reporte de CREDITSAFE
    public static function companySearchReport(){

        $connectId = Request::input('connectId');        

        if (empty($connectId)) {
            return 'No connectId received';
        }

        $token = self::checkCreditsafeToken();

        if ($token == false) {
            return 'No token received';
        }

        $url = ENV('CREDITSAFE_COMPANY') . "/" . urlencode($connectId);

        $queryParams = http_build_query([
            "language" => "en",
            "template" => "full",
            "includeIndicators" => "false"
        ]);
       
        $ch = curl_init($url . '?' . $queryParams);

        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                "Authorization: Bearer {$token}",
                "Accept: application/json"
            ]
        ]);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if (curl_errno($ch)) {
            throw new Exception("cURL error: " . curl_error($ch));
        }

        curl_close($ch);
        
        if ($httpCode === 200) {
            $data = json_decode($response, true);
            $jsonStr = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            
            return $jsonStr;
        }
    }
    
    /* FUNCIONES RELACIONADAS CON TOKEN DE CERDITSAFE */

    // Funcion que se encarga de verificar el estado del token de CREDITSAFE
    public static function checkCreditsafeToken(){   
        // Obtener ultimo token
        $tokenData = SQLConnection::backendStoreProcedure('ValidateCreditSafeToken', ['GET_LAST_TOKEN'], 'select');
        
        if (!empty($tokenData) ) {
            
            $timestamp = $tokenData[0]->created_at;
            $ahora = new DateTime();
            $pasado = new DateTime($timestamp);
            $diff = $ahora->diff($pasado);
            
            if ($diff->h >= 1 || $diff->days > 0 || $diff->i > 60) {
                $token = self::getTokenCreditsafe();

                return $token;
            }

            return $tokenData[0]->token; // Retorna token si ya existe
        }
    }

    // Funcion que se encarga de obtener el token de CREDITSAFE 
    public static function getTokenCreditsafe(){        
        $authUrl = env('CREDITSAFE_URL_AUTH');

        // Si no existe o esta vencido
        $authPayload = json_encode([
            "username" => env('USERNAME_CREDITSAFE'),
            "password" => env('PASSWORD_CREDITSAFE'),
            "grant_type" => "password"
        ]);
        
        $ch = curl_init($authUrl);

        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $authPayload,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json'
            ]
        ]);

        $response = curl_exec($ch);

        if (curl_errno($ch)) {
            throw new Exception('Error en cURL: ' . curl_error($ch));
        }

        curl_close($ch);

        $data = json_decode($response, true);

        if (!isset($data['token'])) {
            return false;
        }

        $nuevoToken = $data['token'];

        // Guardar nuevo token en la base de datos
        SQLConnection::backendStoreProcedure('ValidateCreditSafeToken', ['INSERT_TOKEN', $nuevoToken], 'insert');

        return $nuevoToken;
    }

}