<?php
/**
 * WuzAPI Webhook Receiver v2 - Com suporte a mídias e resolução de LID
 * Salve na pasta static/ do WuzAPI
 * 
 * Configure no banco:
 * UPDATE users SET webhook = 'http://localhost:8080/webhook.php' WHERE token = 'SEU_TOKEN';
 */

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Token');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

$dataFile = __DIR__ . '/webhook_messages.json';
$mediaDir = __DIR__ . '/webhook_media/';

// Criar diretório de mídia se não existir
if (!is_dir($mediaDir)) {
    mkdir($mediaDir, 0755, true);
}

// Configuração do banco PostgreSQL (mesmas credenciais do WuzAPI)
function getDbConnection() {
    // Credenciais do banco (ajuste conforme seu .env)
    $host = 'localhost';
    $port = '5432';
    $dbname = 'wuzapi';
    $user = 'wuzapi';
    $pass = 'wuzapi123';  // Sua senha do .env
    
    try {
        $dsn = "pgsql:host=$host;port=$port;dbname=$dbname";
        $pdo = new PDO($dsn, $user, $pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        return $pdo;
    } catch (PDOException $e) {
        error_log("DB Connection Error: " . $e->getMessage());
        return null;
    }
}

// Resolver LID para número real
function resolveLID($lid) {
    if (empty($lid)) return null;
    
    // Extrair apenas o número do LID
    $lidNumber = preg_replace('/[@:].*/', '', $lid);
    if (empty($lidNumber)) return null;
    
    $pdo = getDbConnection();
    if (!$pdo) return null;
    
    try {
        $stmt = $pdo->prepare("SELECT pn FROM public.whatsmeow_lid_map WHERE lid = ? LIMIT 1");
        $stmt->execute([$lidNumber]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        return $result ? $result['pn'] : null;
    } catch (Exception $e) {
        return null;
    }
}

// Resolver múltiplos LIDs
function resolveLIDs($lids) {
    if (empty($lids)) return [];
    
    $pdo = getDbConnection();
    if (!$pdo) return [];
    
    $resolved = [];
    
    try {
        // Extrair números dos LIDs
        $lidNumbers = array_map(function($lid) {
            return preg_replace('/[@:].*/', '', $lid);
        }, $lids);
        $lidNumbers = array_filter($lidNumbers);
        
        if (empty($lidNumbers)) return [];
        
        $placeholders = implode(',', array_fill(0, count($lidNumbers), '?'));
        $stmt = $pdo->prepare("SELECT lid, pn FROM public.whatsmeow_lid_map WHERE lid IN ($placeholders)");
        $stmt->execute(array_values($lidNumbers));
        
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $resolved[$row['lid']] = $row['pn'];
        }
    } catch (Exception $e) {
        // Silently fail
    }
    
    return $resolved;
}

// GET - Retorna mensagens ou resolve LIDs
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    // Endpoint para resolver LIDs: /webhook.php?resolve_lids=123,456,789
    if (isset($_GET['resolve_lids'])) {
        $lids = explode(',', $_GET['resolve_lids']);
        $resolved = resolveLIDs($lids);
        echo json_encode([
            'success' => true,
            'resolved' => $resolved
        ]);
        exit;
    }
    
    // Endpoint para resolver um único LID: /webhook.php?resolve_lid=123
    if (isset($_GET['resolve_lid'])) {
        $phone = resolveLID($_GET['resolve_lid']);
        echo json_encode([
            'success' => $phone !== null,
            'lid' => $_GET['resolve_lid'],
            'phone' => $phone
        ]);
        exit;
    }
    
    // Limpar mensagens
    if (isset($_GET['clear'])) {
        file_put_contents($dataFile, '[]');
        echo json_encode(['success' => true, 'message' => 'Cleared']);
        exit;
    }
    
    // Retornar mensagens
    $messages = [];
    if (file_exists($dataFile)) {
        $content = file_get_contents($dataFile);
        $messages = json_decode($content, true) ?: [];
    }
    
    $chat = $_GET['chat'] ?? null;
    if ($chat) {
        $messages = array_filter($messages, fn($m) => ($m['chatJid'] ?? '') === $chat);
        $messages = array_values($messages);
    }
    
    $since = intval($_GET['since'] ?? 0);
    if ($since > 0) {
        $messages = array_filter($messages, fn($m) => ($m['timestamp'] ?? 0) > $since);
        $messages = array_values($messages);
    }
    
    echo json_encode([
        'success' => true,
        'messages' => $messages,
        'count' => count($messages)
    ]);
    exit;
}

// DELETE - Limpar mensagens
if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    file_put_contents($dataFile, '[]');
    echo json_encode(['success' => true]);
    exit;
}

// POST - Receber webhook do WuzAPI
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $input = file_get_contents('php://input');
    
    // Log para debug
    $logFile = __DIR__ . '/webhook_debug.log';
    file_put_contents($logFile, date('Y-m-d H:i:s') . " - " . substr($input, 0, 2000) . "\n\n", FILE_APPEND);
    
    $data = json_decode($input, true);
    
    if (!$data) {
        echo json_encode(['success' => false, 'error' => 'Invalid JSON']);
        exit;
    }
    
    // Extrair informações da mensagem - formato WuzAPI
    $info = $data['Info'] ?? $data['info'] ?? [];
    $msgContent = $data['Message'] ?? $data['message'] ?? $data;
    
    // Extrair texto e tipo de mídia
    $text = '';
    $mediaType = null;
    $mediaBase64 = null;
    $mediaUrl = null;
    $fileName = null;
    
    if (isset($msgContent['conversation'])) {
        $text = $msgContent['conversation'];
    } elseif (isset($msgContent['extendedTextMessage']['text'])) {
        $text = $msgContent['extendedTextMessage']['text'];
    } elseif (isset($msgContent['imageMessage'])) {
        $mediaType = 'image';
        $text = $msgContent['imageMessage']['caption'] ?? '📷 Imagem';
        $mediaUrl = $msgContent['imageMessage']['url'] ?? null;
        // Se tiver base64 direto
        if (isset($data['MediaData']) || isset($data['mediaData'])) {
            $mediaBase64 = $data['MediaData'] ?? $data['mediaData'];
        }
    } elseif (isset($msgContent['videoMessage'])) {
        $mediaType = 'video';
        $text = $msgContent['videoMessage']['caption'] ?? '🎥 Vídeo';
        $mediaUrl = $msgContent['videoMessage']['url'] ?? null;
        if (isset($data['MediaData']) || isset($data['mediaData'])) {
            $mediaBase64 = $data['MediaData'] ?? $data['mediaData'];
        }
    } elseif (isset($msgContent['audioMessage'])) {
        $mediaType = 'audio';
        $text = '🎵 Áudio';
        $mediaUrl = $msgContent['audioMessage']['url'] ?? null;
        if (isset($data['MediaData']) || isset($data['mediaData'])) {
            $mediaBase64 = $data['MediaData'] ?? $data['mediaData'];
        }
    } elseif (isset($msgContent['documentMessage'])) {
        $mediaType = 'document';
        $fileName = $msgContent['documentMessage']['fileName'] ?? 'documento';
        $text = '📄 ' . $fileName;
        $mediaUrl = $msgContent['documentMessage']['url'] ?? null;
        if (isset($data['MediaData']) || isset($data['mediaData'])) {
            $mediaBase64 = $data['MediaData'] ?? $data['mediaData'];
        }
    } elseif (isset($msgContent['stickerMessage'])) {
        $mediaType = 'sticker';
        $text = '🏷️ Sticker';
    } elseif (isset($data['Body'])) {
        $text = $data['Body'];
    } elseif (isset($data['body'])) {
        $text = $data['body'];
    } elseif (isset($data['text'])) {
        $text = $data['text'];
    }
    
    // Se não tem texto nem mídia, ignorar
    if (empty($text) && empty($mediaType)) {
        echo json_encode(['success' => true, 'skipped' => true, 'reason' => 'no content']);
        exit;
    }
    
    // Extrair chat JID
    $chatJid = $info['Chat'] ?? $info['RemoteJid'] ?? $data['Chat'] ?? $data['chat'] ?? $data['from'] ?? '';
    
    // Extrair sender
    $senderJid = $info['Sender'] ?? $info['SenderJid'] ?? $data['Sender'] ?? $data['sender'] ?? '';
    $senderName = $info['PushName'] ?? $data['PushName'] ?? $data['pushName'] ?? $data['senderName'] ?? '';
    
    if (empty($chatJid) && !empty($senderJid)) {
        $chatJid = preg_replace('/:.*@/', '@', $senderJid);
    }
    
    $senderNumber = '';
    if (!empty($senderJid)) {
        if (preg_match('/(\d+)/', $senderJid, $matches)) {
            $senderNumber = $matches[1];
        }
    }
    
    // Criar objeto de mensagem
    $message = [
        'id' => $info['Id'] ?? $info['ID'] ?? $data['Id'] ?? $data['id'] ?? uniqid('msg_'),
        'chatJid' => $chatJid,
        'senderJid' => $senderJid,
        'senderNumber' => $senderNumber,
        'senderName' => $senderName,
        'text' => $text,
        'timestamp' => $info['Timestamp'] ?? $data['Timestamp'] ?? $data['timestamp'] ?? time(),
        'fromMe' => $info['IsFromMe'] ?? $info['FromMe'] ?? $data['IsFromMe'] ?? $data['fromMe'] ?? false,
        'isGroup' => strpos($chatJid, '@g.us') !== false,
        'mediaType' => $mediaType,
        'mediaUrl' => $mediaUrl,
        'mediaBase64' => $mediaBase64,
        'fileName' => $fileName,
        'receivedAt' => time()
    ];
    
    // Carregar mensagens existentes
    $messages = [];
    if (file_exists($dataFile)) {
        $content = file_get_contents($dataFile);
        $messages = json_decode($content, true) ?: [];
    }
    
    // Verificar duplicata
    $isDuplicate = false;
    foreach ($messages as $m) {
        if (($m['id'] ?? '') === $message['id']) {
            $isDuplicate = true;
            break;
        }
    }
    
    if (!$isDuplicate) {
        $messages[] = $message;
        
        // Manter só últimas 1000 mensagens
        if (count($messages) > 1000) {
            $messages = array_slice($messages, -1000);
        }
        
        file_put_contents($dataFile, json_encode($messages, JSON_PRETTY_PRINT));
    }
    
    echo json_encode([
        'success' => true,
        'saved' => !$isDuplicate,
        'messageId' => $message['id'],
        'chatJid' => $message['chatJid'],
        'mediaType' => $mediaType
    ]);
    exit;
}

echo json_encode(['error' => 'Method not allowed']);