#!/usr/bin/env php
<?php
/**
 * Automatically get Page Access Token from User Token
 */

$_SERVER['REQUEST_METHOD'] = 'GET';
require_once __DIR__ . '/config/config.php';

echo "=== Automatic Page Token Retrieval ===\n\n";

$db = Database::getInstance()->getConnection();
$stmt = $db->prepare("SELECT value_encrypted FROM settings WHERE section = 'facebook' AND `key` = 'FB_PAGE_ACCESS_TOKEN'");
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$userToken = $result['value_encrypted'] ?? null;

if (!$userToken) {
    echo "✗ No token found in settings\n";
    exit(1);
}

echo "Current Token: " . substr($userToken, 0, 20) . "...\n";
echo "Getting managed pages...\n\n";

// Get pages managed by this user
$url = "https://graph.facebook.com/v18.0/me/accounts?fields=id,name,access_token,category,tasks&access_token=" . urlencode($userToken);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$data = json_decode($response, true);

if ($httpCode !== 200 || !isset($data['data'])) {
    echo "✗ Failed to get pages\n";
    echo "Error: " . ($data['error']['message'] ?? 'Unknown error') . "\n";
    echo "HTTP Code: $httpCode\n\n";

    echo "This User Token cannot access pages.\n";
    echo "You need to get a new token with 'pages_manage_posts' permission.\n";
    exit(1);
}

if (empty($data['data'])) {
    echo "✗ No pages found for this token\n";
    echo "Make sure your Facebook account manages at least one Page.\n";
    exit(1);
}

echo "Found " . count($data['data']) . " page(s):\n\n";

// Get current page ID from settings
$stmt = $db->prepare("SELECT value_encrypted FROM settings WHERE section = 'facebook' AND `key` = 'FB_PAGE_ID'");
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$currentPageId = $result['value_encrypted'] ?? null;

$selectedPage = null;
$pageNumber = 1;

foreach ($data['data'] as $page) {
    $isCurrent = ($page['id'] === $currentPageId) ? ' ← CURRENT' : '';
    echo "[$pageNumber] {$page['name']}$isCurrent\n";
    echo "    ID: {$page['id']}\n";
    echo "    Category: " . ($page['category'] ?? 'N/A') . "\n";

    if (!empty($page['access_token'])) {
        echo "    ✓ Has Page Access Token\n";

        // Check token permissions
        $tokenUrl = "https://graph.facebook.com/v18.0/me/permissions?access_token=" . urlencode($page['access_token']);
        $ch = curl_init($tokenUrl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        $permResponse = curl_exec($ch);
        curl_close($ch);

        $permData = json_decode($permResponse, true);
        $hasManagePosts = false;
        $hasReadEngagement = false;

        if (isset($permData['data'])) {
            foreach ($permData['data'] as $perm) {
                if ($perm['permission'] === 'pages_manage_posts' && $perm['status'] === 'granted') {
                    $hasManagePosts = true;
                }
                if ($perm['permission'] === 'pages_read_engagement' && $perm['status'] === 'granted') {
                    $hasReadEngagement = true;
                }
            }
        }

        echo "    Permissions:\n";
        echo "      " . ($hasManagePosts ? '✓' : '✗') . " pages_manage_posts\n";
        echo "      " . ($hasReadEngagement ? '✓' : '✗') . " pages_read_engagement\n";

        if ($hasManagePosts && $hasReadEngagement) {
            echo "    ✓ This token is ready to use!\n";
            if ($page['id'] === $currentPageId && !$selectedPage) {
                $selectedPage = $page;
            }
        } else {
            echo "    ✗ Missing required permissions\n";
        }
    } else {
        echo "    ✗ No Page Access Token available\n";
    }

    echo "\n";
    $pageNumber++;
}

// If current page has valid token, offer to update
if ($selectedPage && !empty($selectedPage['access_token'])) {
    echo "========================================\n";
    echo "Found valid Page Token for current page!\n";
    echo "========================================\n\n";
    echo "Page: {$selectedPage['name']}\n";
    echo "ID: {$selectedPage['id']}\n";
    echo "Token: " . substr($selectedPage['access_token'], 0, 30) . "...\n\n";

    echo "Do you want to update this token in the database? (yes/no): ";
    $handle = fopen("php://stdin", "r");
    $line = trim(fgets($handle));
    fclose($handle);

    if (strtolower($line) === 'yes' || strtolower($line) === 'y') {
        $stmt = $db->prepare("UPDATE settings SET value_encrypted = ?, updated_at = NOW() WHERE section = 'facebook' AND `key` = 'FB_PAGE_ACCESS_TOKEN'");
        $stmt->execute([$selectedPage['access_token']]);

        echo "\n✓ Token updated successfully!\n";
        echo "\nRun this to verify:\n";
        echo "docker exec blogpostai_web php /var/www/html/check-token-permissions.php\n";
    } else {
        echo "\nToken not updated. You can update manually:\n";
        echo "Token: {$selectedPage['access_token']}\n";
    }
} else {
    echo "========================================\n";
    echo "No valid Page Token found automatically\n";
    echo "========================================\n\n";
    echo "Please follow the manual steps:\n";
    echo "1. Go to: https://developers.facebook.com/tools/explorer/\n";
    echo "2. Click 'Get Token' → 'Get Page Access Token'\n";
    echo "3. Select your page and grant 'pages_manage_posts' permission\n";
    echo "4. Update the token in settings\n";
}
