<?php
header("Content-Type: application/json");
require_once __DIR__ . "/../../../includes/config.php";
require_once __DIR__ . "/../../../includes/whatsapp/EvolutionAPI.php";

$storeId = $_SESSION["store_id"] ?? null;
if (!$storeId) {
    echo json_encode(["error" => "Sessão não encontrada"]);
    exit;
}

$input = json_decode(file_get_contents("php://input"), true);
$action = $input["action"] ?? $_POST["action"] ?? $_GET["action"] ?? "";

$pdo = getDB();

// Buscar dados da loja
$storeStmt = $pdo->prepare("SELECT id, name, slug, subdomain FROM stores WHERE id = ?");
$storeStmt->execute([$storeId]);
$store = $storeStmt->fetch(PDO::FETCH_ASSOC);

if (!$store) {
    echo json_encode(["error" => "Loja não encontrada"]);
    exit;
}

// Nome da instância baseado no slug ou subdomain da loja
$instanceName = $store["slug"] ?? $store["subdomain"] ?? "loja-" . $storeId;

// Buscar configuração global (store_id = 0)
$globalStmt = $pdo->prepare("SELECT api_url, api_key FROM whatsapp_config WHERE store_id = 0");
$globalStmt->execute();
$globalConfig = $globalStmt->fetch(PDO::FETCH_ASSOC);

if (!$globalConfig || empty($globalConfig["api_url"]) || empty($globalConfig["api_key"])) {
    echo json_encode(["error" => "Evolution API não configurada pelo administrador"]);
    exit;
}

$apiUrl = rtrim($globalConfig["api_url"], "/");
$apiKey = $globalConfig["api_key"];

// Criar instância da API
$api = new EvolutionAPI($apiUrl, $apiKey, $instanceName);

// Função para criar instância se não existir
function getOrCreateInstance($api, $instanceName) {
    // Verificar estado atual
    $status = $api->getConnectionState($instanceName);
    
    // Se instância não existe (404 ou erro "not found")
    if ($status['http_code'] === 404 || 
        (isset($status['data']['error']) && stripos(json_encode($status['data']), 'not found') !== false) ||
        (isset($status['data']['message']) && stripos($status['data']['message'], 'not found') !== false)) {
        
        // Criar instância
        $create = $api->createInstance($instanceName);
        
        if ($create['success'] || $create['http_code'] === 201) {
            sleep(1);
            return $api->connectInstance($instanceName);
        }
        return $create;
    }
    
    // Se não está conectado, solicitar conexão para obter QR Code
    $state = $status['data']['state'] ?? $status['data']['instance']['state'] ?? null;
    if ($state !== 'open') {
        return $api->connectInstance($instanceName);
    }
    
    return $status;
}

switch ($action) {
    case "get_qrcode":
        $result = getOrCreateInstance($api, $instanceName);
        
        $qrcode = null;
        
        if (isset($result['data']['base64'])) {
            $qrcode = $result['data']['base64'];
        } elseif (isset($result['data']['qrcode']['base64'])) {
            $qrcode = $result['data']['qrcode']['base64'];
        } elseif (isset($result['data']['code'])) {
            $qrcode = $result['data']['code'];
        }
        
        if ($qrcode) {
            if (strpos($qrcode, 'data:image') !== 0) {
                $qrcode = 'data:image/png;base64,' . $qrcode;
            }
            echo json_encode(["success" => true, "qrcode" => $qrcode, "instance" => $instanceName]);
        } elseif (isset($result['data']['state']) && $result['data']['state'] === 'open') {
            echo json_encode(["success" => true, "connected" => true, "instance" => $instanceName, "message" => "WhatsApp já está conectado!"]);
        } else {
            $connect = $api->connectInstance($instanceName);
            $qrcode = $connect['data']['base64'] ?? $connect['data']['qrcode']['base64'] ?? null;
            
            if ($qrcode) {
                if (strpos($qrcode, 'data:image') !== 0) {
                    $qrcode = 'data:image/png;base64,' . $qrcode;
                }
                echo json_encode(["success" => true, "qrcode" => $qrcode, "instance" => $instanceName]);
            } else {
                echo json_encode(["success" => false, "error" => "Não foi possível gerar QR Code", "debug" => $connect['data'] ?? $result['data']]);
            }
        }
        break;

    case "check_connection":
    case "get_status":
        $status = $api->getConnectionState($instanceName);
        
        $connected = false;
        $state = 'unknown';
        
        if (isset($status['data']['state'])) {
            $state = $status['data']['state'];
            $connected = ($state === 'open');
        } elseif (isset($status['data']['instance']['state'])) {
            $state = $status['data']['instance']['state'];
            $connected = ($state === 'open');
        }
        
        if ($connected) {
            $updateStmt = $pdo->prepare("UPDATE whatsapp_config SET is_connected = 1, updated_at = NOW() WHERE store_id = ?");
            $updateStmt->execute([$storeId]);
        }
        
        echo json_encode(["success" => true, "connected" => $connected, "state" => $state, "instance" => $instanceName]);
        break;

    case "disconnect":
        $logout = $api->logoutInstance($instanceName);
        
        if ($logout['success'] || $logout['http_code'] === 200) {
            $updateStmt = $pdo->prepare("UPDATE whatsapp_config SET is_connected = 0, updated_at = NOW() WHERE store_id = ?");
            $updateStmt->execute([$storeId]);
            
            echo json_encode(["success" => true, "message" => "Desconectado com sucesso"]);
        } else {
            echo json_encode(["success" => false, "error" => $logout['data']['message'] ?? $logout['data']['error'] ?? "Erro ao desconectar", "debug" => $logout['data']]);
        }
        break;

    case "send_test":
        $phone = $input["phone"] ?? $_POST["phone"] ?? "";
        if (empty($phone)) {
            echo json_encode(["error" => "Número de telefone não informado"]);
            exit;
        }
        
        $message = "*Mensagem de Teste* 🎉\n\nSua integração WhatsApp do MontaLoja está funcionando!\n\nLoja: " . $store["name"] . "\n_Enviado às " . date('H:i:s') . "_";
        
        $result = $api->sendText($phone, $message);
        
        if ($result['success']) {
            echo json_encode(["success" => true, "message" => "Mensagem de teste enviada com sucesso!"]);
        } else {
            echo json_encode(["success" => false, "error" => $result['data']['message'] ?? $result['data']['error'] ?? "Erro ao enviar mensagem"]);
        }
        break;

    default:
        echo json_encode(["error" => "Ação inválida: " . $action]);
}
