<?php

class EcomZoneAPI
{
    private $apiKey;
    private $apiUrl;
    private $lastRequestTime;
    private $requestCount = 0;
    private const RATE_LIMIT = 120; // requests per minute
    private const RATE_WINDOW = 60; // seconds

    public function __construct()
    {
        $this->apiKey = Configuration::get('ECOMZONE_API_KEY');
        $this->apiUrl = Configuration::get('ECOMZONE_API_URL');
        $this->lastRequestTime = time();
        
        // Debug log the configuration
        PrestaShopLogger::addLog(
            sprintf('EcomZone API initialized with URL: %s', $this->apiUrl),
            1,
            null,
            'EcomZone'
        );
    }

    private function checkRateLimit()
    {
        $currentTime = time();
        if ($currentTime - $this->lastRequestTime >= self::RATE_WINDOW) {
            $this->requestCount = 0;
            $this->lastRequestTime = $currentTime;
        }

        if ($this->requestCount >= self::RATE_LIMIT) {
            throw new Exception('Rate limit exceeded. Please wait before making more requests.');
        }

        $this->requestCount++;
    }

    private function makeRequest($method, $url, $params = [])
    {
        try {
            // Debug log the request
            PrestaShopLogger::addLog(
                sprintf('Making request: %s %s', $method, $url),
                1,
                null,
                'EcomZone'
            );

            $curl = curl_init();
            
            // Add token as URL parameter AND header for maximum compatibility
            $urlWithToken = $url . (strpos($url, '?') === false ? '?' : '&') . 'token=' . $this->apiKey;
            if ($method === 'GET' && !empty($params)) {
                $urlWithToken .= '&' . http_build_query($params);
            }

            $options = [
                CURLOPT_URL => $urlWithToken,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => '',
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => $method,
                CURLOPT_SSL_VERIFYPEER => false, // For testing only, remove in production
                CURLOPT_SSL_VERIFYHOST => false, // For testing only, remove in production
                CURLOPT_HTTPHEADER => [
                    'Authorization: Bearer ' . $this->apiKey,
                    'Accept: application/json',
                    'Content-Type: application/json'
                ],
            ];

            if ($method === 'POST') {
                $options[CURLOPT_POSTFIELDS] = json_encode($params);
            }

            curl_setopt_array($curl, $options);

            // Debug log the curl options
            PrestaShopLogger::addLog(
                sprintf('Curl options: %s', json_encode([
                    'url' => $urlWithToken,
                    'headers' => $options[CURLOPT_HTTPHEADER]
                ])),
                1,
                null,
                'EcomZone'
            );

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

            // Debug log the response
            PrestaShopLogger::addLog(
                sprintf('Response Code: %d, Error: %s, Response: %s', 
                    $httpCode, 
                    $err ?: 'none', 
                    substr($response, 0, 1000)
                ),
                1,
                null,
                'EcomZone'
            );

            curl_close($curl);

            if ($err) {
                throw new Exception("cURL Error: " . $err);
            }

            if ($httpCode >= 400) {
                throw new Exception("HTTP Error: " . $httpCode . " Response: " . $response);
            }

            return json_decode($response, true);
        } catch (Exception $e) {
            PrestaShopLogger::addLog(
                'EcomZone API Error: ' . $e->getMessage(),
                3,
                null,
                'EcomZone'
            );
            throw $e;
        }
    }

    public function getCatalog($perPage = 1000)
    {
        $this->checkRateLimit();
        $url = $this->apiUrl . '/catalog';
        $allProducts = [];
        $currentPage = 1;
        
        do {
            $params = [
                'per_page' => $perPage,
                'page' => $currentPage
            ];
            
            $response = $this->makeRequest('GET', $url, $params);
            
            if (isset($response['data']) && is_array($response['data'])) {
                $allProducts = array_merge($allProducts, $response['data']);
            }
            
            $currentPage++;
            // Check if there's a next page
            $hasNextPage = isset($response['next_page_url']) && $response['next_page_url'] !== null;
            
        } while ($hasNextPage);
        
        return ['data' => $allProducts];
    }

    public function getProduct($sku)
    {
        $this->checkRateLimit();
        $url = $this->apiUrl . '/product/' . urlencode($sku);
        return $this->makeRequest('GET', $url);
    }

    public function createOrder($orderData)
    {
        $this->checkRateLimit();
        $url = $this->apiUrl . '/ordering';
        return $this->makeRequest('POST', $url, $orderData);
    }
} 