<?php
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/functions.php';

require_admin();

header('Content-Type: application/json');

$action   = $_GET['action'] ?? '';
$baseUrl  = EVOLUTION_API_URL;
$apiKey   = EVOLUTION_API_KEY;
$instance = get_system_setting('evolution_instance', '');

if (empty($baseUrl) || empty($apiKey)) {
    http_response_code(503);
    echo json_encode(['error' => 'Evolution API não configurada. Verifique EVOLUTION_API_URL e EVOLUTION_API_KEY no .env']);
    exit;
}

function evo_request(string $method, string $path, string $baseUrl, string $apiKey, ?array $body = null): array {
    $ctx = stream_context_create([
        'http' => [
            'method'        => $method,
            'header'        => "apikey: {$apiKey}\r\nContent-Type: application/json\r\n",
            'content'       => $body !== null ? json_encode($body) : null,
            'timeout'       => 15,
            'ignore_errors' => true,
        ],
        'ssl' => ['verify_peer' => false, 'verify_peer_name' => false],
    ]);
    $url    = $baseUrl . $path;
    $result = @file_get_contents($url, false, $ctx);
    $code   = 0;
    foreach ($http_response_header ?? [] as $h) {
        if (preg_match('#HTTP/\S+\s+(\d+)#', $h, $m)) { $code = (int)$m[1]; break; }
    }
    $data = ($result !== false && $result !== '') ? (@json_decode($result, true) ?? []) : [];
    return ['code' => $code, 'data' => $data, 'raw' => $result];
}

// Extrai o estado da instância de qualquer formato de resposta da Evolution API
function evo_extract_state(array $data): string {
    return $data['instance']['state']
        ?? $data['state']
        ?? $data['instance']['status']
        ?? $data['status']
        ?? 'unknown';
}

// Extrai o QR code base64 de qualquer formato de resposta
function evo_extract_qr(array $data): ?string {
    return $data['base64']
        ?? $data['qrcode']['base64']
        ?? $data['qrcode']
        ?? $data['code']
        ?? null;
}

// Garante que a instância existe, criando se necessário. Retorna true se ok.
function evo_ensure_instance(string $instance, string $baseUrl, string $apiKey): bool {
    $check = evo_request('GET', "/instance/connectionState/{$instance}", $baseUrl, $apiKey);
    if ($check['code'] === 404 || empty($check['data'])) {
        $create = evo_request('POST', '/instance/create', $baseUrl, $apiKey, [
            'instanceName' => $instance,
            'qrcode'       => true,
            'integration'  => 'WHATSAPP-BAILEYS',
        ]);
        return $create['code'] < 400;
    }
    return true;
}

switch ($action) {

    case 'status':
        if (empty($instance)) {
            echo json_encode(['state' => 'not_configured']);
            exit;
        }
        $r     = evo_request('GET', "/instance/connectionState/{$instance}", $baseUrl, $apiKey);
        // Instância não existe → trata como desconectado (não unknown)
        if ($r['code'] === 404 || empty($r['data'])) {
            echo json_encode(['state' => 'close']);
            exit;
        }
        $state = evo_extract_state($r['data']);
        $phone = $r['data']['instance']['profileName']
              ?? $r['data']['instance']['owner']
              ?? $r['data']['instance']['name']
              ?? '';
        echo json_encode(['state' => $state, 'phone' => $phone, 'raw' => $r['data']]);
        break;

    case 'qrcode':
        if (empty($instance)) {
            echo json_encode(['error' => 'Nome da instância não configurado.']);
            exit;
        }

        // Garante que a instância existe
        evo_ensure_instance($instance, $baseUrl, $apiKey);

        // Aguarda a instância inicializar (Evolution API pode demorar um instante)
        sleep(1);

        // Tenta buscar o QR Code
        $r  = evo_request('GET', "/instance/connect/{$instance}", $baseUrl, $apiKey);
        $qr = evo_extract_qr($r['data']);

        // Alguns versions retornam o QR dentro de um campo diferente
        if (!$qr && isset($r['data']['code'])) {
            $qr = $r['data']['code'];
        }

        if (!$qr) {
            // Verifica se já está conectado
            $state = evo_extract_state($r['data']);
            if ($state === 'open') {
                echo json_encode(['connected' => true]);
                exit;
            }
            // Retorna erro com resposta bruta para diagnóstico
            echo json_encode([
                'error' => 'QR Code não disponível. A instância pode estar inicializando — tente novamente em alguns segundos.',
                'state' => $state,
                'debug' => $r['data'],
            ]);
            exit;
        }

        // Garante que está no formato data URI
        if (!str_starts_with($qr, 'data:')) {
            $qr = 'data:image/png;base64,' . $qr;
        }

        echo json_encode(['qrcode' => $qr]);
        break;

    case 'disconnect':
        if (empty($instance)) {
            echo json_encode(['error' => 'Instância não configurada.']);
            exit;
        }
        if (!csrf_check($_POST['csrf_token'] ?? null)) {
            http_response_code(403);
            echo json_encode(['error' => 'CSRF inválido.']);
            exit;
        }
        $r = evo_request('DELETE', "/instance/logout/{$instance}", $baseUrl, $apiKey);
        echo json_encode(['ok' => $r['code'] < 400, 'code' => $r['code']]);
        break;

    default:
        http_response_code(400);
        echo json_encode(['error' => 'Ação inválida.']);
}
