<?php

if ( ! defined( 'ABSPATH' ) ) exit;

require_once __DIR__ ."/../../../Classes/DigitalSignage4_caller.php";
require_once __DIR__ ."/../../../Kernel/API/Entity/DigitalSignage4_APIResponseEntity.php";
require_once __DIR__ ."/../../../Kernel/API/Entity/DigitalSignage4_Entity.php";
require_once __DIR__ ."/../../../Kernel/API/Manager/DigitalSignage4_Exception.php";
require_once __DIR__ ."/../../../Kernel/Translations/DigitalSignage4_Translate.php";

class DigitalSignage4_API_Linker
{
    public const API_URL = "https://api.productvideo.io/API_v2/";

    /**
     * @param $remoteEntityName
     * @param string | Entity $entityName
     * @throws DigitalSignage4_Exception
     */
    public static function get_entitys($remoteEntityName, $entityName, $bearerToken = "")
    {
        if (class_exists($entityName)) {
            $responseApi = self::get($remoteEntityName, $bearerToken);

            $entitys = $responseApi->getDatas();

            foreach ($entitys as $key => $entity) {
                $tempEntity = new $entityName();

                $entitys[$key] = $tempEntity->hydrate($entity);
            }

            return $entitys;
        } else {
            throw new DigitalSignage4_Exception(esc_html(DigitalSignage4_Translate::getTraduction('class_introuvable', esc_html($entityName))));
        }
    }

    /**
     * @param $remoteEntityName
     * @param string $bearerToken
     * @return DigitalSignage4_APIResponseEntity
     * @throws DigitalSignage4_Exception
     */
	 
	 public static function get($remoteEntityName, $bearerToken = ""){
		$url = self::API_URL . $remoteEntityName;

		// Préparation des arguments pour la requête
		$args = [
			'method'  => 'GET',
			'timeout' => 60,
			'headers' => [
				'User-Agent'    => 'Mozilla/4.0 (compatible;)',
				'Content-Type'  => 'multipart/form-data',
                                'Lang'          => substr(get_bloginfo('language'), 0, 2),
                                'Sender'        => 'Plugin Woocommerce PVG',
                                'Version'        => '1.0.12',
			],
		];

		// Ajout du bearer token si présent
		if (!empty($bearerToken)) {
			$args['headers']['Authorization'] = 'Bearer ' . $bearerToken;
		}

		// Initialisation de la variable de validité de la réponse
		$responseValid = false;
		$output = null;

		// Boucle d'appel de l'API, 10 fois maximum
		for ($i = 0; $i < 10; $i++) {
			// Effectuer la requête
			$response = wp_remote_request($url, $args);

			// Vérifier si la requête a réussi
			if (!is_wp_error($response)) {
				$output = wp_remote_retrieve_body($response);

				// Vérifier si la réponse est un JSON valide avec 5 éléments
				if ($output && self::isJson($output) && count(json_decode($output, true)) === 5) {
					$responseValid = true;
					break;
				}
			}
		}

		if (!$responseValid) {
			// Gestion d'erreur si l'API n'est pas joignable
			$errorMessage = is_wp_error($response)
				? $response->get_error_message()
				: __('API unreachable or invalid response.', 'digitalsignage4');
			throw new DigitalSignage4_Exception(esc_html($errorMessage));
		}

		// Vérifier et traiter la réponse JSON
		try {
			$output = json_decode($output, true);
			$tempEntity = new DigitalSignage4_APIResponseEntity();
			$responseHydrated = $tempEntity->hydrate($output);
			return $responseHydrated;
		} catch (Exception $e) {
			throw new DigitalSignage4_Exception(esc_html($e->getMessage()));
		}
	}

	
    /**
     * @throws DigitalSignage4_Exception
     */
	 
	public static function post($remoteEntityName, $data, $bearerToken = ""){
		$url = self::API_URL . $remoteEntityName;
		// Préparation des arguments pour la requête
		$args = [
			'method'  => 'POST',
			'timeout' => 60,
			'headers' => [
				'User-Agent'    => 'Mozilla/4.0 (compatible;)',
				'Content-Type'  => 'application/x-www-form-urlencoded', // Important pour $_POST
                                'Lang'          => substr(get_bloginfo('language'), 0, 2),
                                'Sender'        => 'Plugin Woocommerce PVG',
                                'Version'        => '1.0.12',
			],
			'body'    => $data, // Les données sont correctement envoyées
		];

		// Ajout du bearer token si présent
		if (!empty($bearerToken)) {
			$args['headers']['Authorization'] = 'Bearer ' . $bearerToken;
		}

		// Initialisation de la variable de validité de la réponse
		$responseValid = false;
		$output = null;

		// Boucle d'appel de l'API, 10 fois maximum
		for ($i = 0; $i < 10; $i++) {
                    // Effectuer la requête
                    $response = wp_remote_post($url, $args);

                    // Vérifier si la requête a réussi
                    if (!is_wp_error($response)) {
                        $output = wp_remote_retrieve_body($response);

                        // Vérifier si la réponse est un JSON valide avec 5 éléments
                        if ($output && self::isJson($output) && count(json_decode($output, true)) === 5) {
                                $responseValid = true;
                                break;
                        }
                    }
		}

		if (!$responseValid) {
			// Gestion d'erreur si l'API n'est pas joignable
			$errorMessage = is_wp_error($response)
				? $response->get_error_message()
				: __('API unreachable or invalid response.', 'digitalsignage4');
			throw new DigitalSignage4_Exception(esc_html($errorMessage));
		}

		// Vérifier et traiter la réponse JSON
		try {
			$output = json_decode($output, true);
			$tempEntity = new DigitalSignage4_APIResponseEntity();
                        if (self::isJson($output['datas'])) $output['datas'] = json_decode($output['datas'],true);
			return $tempEntity->hydrate($output);
		} catch (Exception $e) {
			throw new DigitalSignage4_Exception(esc_html($e->getMessage()));
		}
	}
	

    private static function isJson($string)
    {
        if (!is_string($string)) return false;
        json_decode($string);
        return (json_last_error() == JSON_ERROR_NONE);
    }


    private static function isCurlInstalled()
    {
        return function_exists('curl_version');
    }
}
