<?php

namespace SiipAvailableIps;

/**
 * Servicio para interactuar con la API de UCRM
 * Permite consultar servicios y filtrar sitios bloqueados
 */
class CrmService
{
    private $apiUrl;
    private $apiToken;
    private $logger;

    /**
     * Constructor
     * 
     * @param string $apiUrl URL base de la API de CRM (ej: https://servidor/crm/api/v1.0)
     * @param string $apiToken Token de API de CRM (X-Auth-App-Key)
     * @param Logger|null $logger Logger opcional para debugging
     */
    public function __construct($apiUrl, $apiToken, $logger = null)
    {
        $this->apiUrl = rtrim($apiUrl, '/');
        $this->apiToken = $apiToken;
        $this->logger = $logger;
    }

    /**
     * Obtener lista de Site IDs de UISP que tienen servicios bloqueados
     * (suspendidos o finalizados) en CRM
     * 
     * @return array Lista de UUIDs de sitios bloqueados
     */
    public function getBlockedSiteIds()
    {
        if ($this->logger) {
            $this->logger->appendLog('CRM: Consultando servicios suspendidos/finalizados...');
        }

        // Obtener servicios con status 2 (Ended) y 3 (Suspended)
        $services = $this->getServicesByStatus([2, 3]);

        if ($services === false) {
            if ($this->logger) {
                $this->logger->appendLog('CRM: Error al consultar servicios');
            }
            return [];
        }

        $blockedSites = [];
        foreach ($services as $service) {
            // Solo agregar si tiene vinculación con UISP
            if (!empty($service['unmsClientSiteId'])) {
                $blockedSites[] = $service['unmsClientSiteId'];
            }
        }

        $blockedSites = array_unique($blockedSites);

        if ($this->logger) {
            $this->logger->appendLog(sprintf(
                'CRM: Encontrados %d sitios bloqueados por servicios suspendidos/finalizados',
                count($blockedSites)
            ));
        }

        return $blockedSites;
    }

    /**
     * Obtener servicios filtrados por estado
     * 
     * @param array $statuses Array de estados a filtrar (ej: [2, 3])
     * @return array|false Array de servicios o false en caso de error
     */
    private function getServicesByStatus($statuses)
    {
        // Construir parámetros de query
        $params = [];
        foreach ($statuses as $status) {
            $params[] = 'statuses[]=' . intval($status);
        }

        $url = $this->apiUrl . '/clients/services?' . implode('&', $params);

        if ($this->logger) {
            $this->logger->appendLog("CRM: Consultando $url");
        }

        // Hacer request HTTP
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'X-Auth-App-Key: ' . $this->apiToken,
            'Content-Type: application/json'
        ]);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Para desarrollo local

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

        if ($error) {
            if ($this->logger) {
                $this->logger->appendLog("CRM: Error cURL: $error");
            }
            return false;
        }

        if ($httpCode !== 200) {
            if ($this->logger) {
                $this->logger->appendLog("CRM: HTTP $httpCode - $response");
            }
            return false;
        }

        $data = json_decode($response, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            if ($this->logger) {
                $this->logger->appendLog('CRM: Error al decodificar JSON');
            }
            return false;
        }

        if ($this->logger) {
            $this->logger->appendLog(sprintf('CRM: Obtenidos %d servicios', count($data)));
        }

        return $data;
    }
}
