<?php
/**
 * WhatsAppService - Encapsula a lógica de integração com a Evolution API
 * Substitui a lógica duplicada em wpp-api.php e whatsapp-api-v2.php
 */
class WhatsAppService {
    private $apiBase;
    private $apiKey;
    private $isStaging;
    private $currentDomain;

    public function __construct() {
        $this->isStaging = (strpos($_SERVER['HTTP_HOST'] ?? '', 'dev.') !== false);
        $this->currentDomain = $this->isStaging ? 'https://dev.duolead.com.br' : 'https://duolead.com.br';
        
        // Configurações da API Evolution (Idealmente viriam de um arquivo de config ou env)
        $this->apiBase = 'https://evo.duolead.com.br';
        $this->apiKey = 'montaloja2025';
    }

    /**
     * Envia os headers CORS padrão para a aplicação
     */
    public function sendCorsHeaders() {
        header('Access-Control-Allow-Origin: ' . $this->currentDomain);
        header('Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: Content-Type, apikey');
        header('Access-Control-Allow-Credentials: true');
    }

    /**
     * Envia os headers JSON e de cache control
     */
    public function sendJsonHeaders() {
        header('Content-Type: application/json');
        header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
        header('Pragma: no-cache');
    }

    /**
     * Trata requisições OPTIONS (Preflight)
     */
    public function handlePreflight() {
        if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
            $this->sendCorsHeaders();
            http_response_code(200);
            exit;
        }
    }

    /**
     * Valida a instância e retorna sanitizada
     */
    public function validateInstance($instance) {
        if (empty($instance)) {
            $this->sendError(400, 'Instância não informada');
        }
        return preg_replace('/[^a-zA-Z0-9_-]/', '', $instance);
    }

    /**
     * Executa a requisição para a API Evolution
     */
    public function proxyRequest($action, $instance) {
        $endpoint = '';
        $method = 'GET';
        $postData = null;

        switch ($action) {
            case 'status':
                $endpoint = "/instance/connectionState/{$instance}";
                break;
            
            case 'create':
                $endpoint = "/instance/create";
                $method = 'POST';
                $postData = json_encode([
                    'instanceName' => $instance,
                    'qrcode' => true,
                    'integration' => 'WHATSAPP-BAILEYS'
                ]);
                break;
            
            case 'connect':
                $endpoint = "/instance/connect/{$instance}";
                break;
            
            case 'disconnect':
                $endpoint = "/instance/logout/{$instance}";
                $method = 'DELETE';
                break;
            
            default:
                $this->sendError(400, 'Ação inválida');
        }

        $headers = [
            'apikey: ' . $this->apiKey,
            'Content-Type: application/json'
        ];

        // Se o cliente enviou apikey no header, repassamos (opcional, dependendo da regra de negócio original)
        // No código original, a apiKey era fixa no código, então mantivemos assim.

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $this->apiBase . $endpoint,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_SSL_VERIFYPEER => false
        ]);

        if ($method === 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            if ($postData) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            }
        } elseif ($method === 'DELETE') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
        }

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

        if ($error) {
            $this->sendError(500, 'Erro de conexão: ' . $error);
        }

        http_response_code($httpCode);
        echo $response;
    }

    /**
     * Helper para enviar erro JSON e encerrar
     */
    private function sendError($code, $message) {
        http_response_code($code);
        echo json_encode(['error' => $message]);
        exit;
    }
}
