yazrkisvs3vvvsv33svrhetrjsvyvsvvyjsvsvs
tavsuysvssvvjvvyjyjkvsvqd
qfogsvvsvsegjdgdfgdskhgdksvqsvshdqsd
<?php
// api/google-token-check.php — Monitor diario del token Google Ads
// Cron: 0 6 * * *  →  php /home/dimark93/public_html/supercerebro/api/google-token-check.php
// También ejecutable vía web con ?cron_token=CRON_SECRET para llamadas manuales/externas.

require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../credentials.php';

$is_cli   = php_sapi_name() === 'cli';
$req_tok  = $_GET['cron_token'] ?? ($_SERVER['HTTP_X_CRON_TOKEN'] ?? '');
$secret   = defined('CRON_SECRET') ? CRON_SECRET : '';

if (!$is_cli) {
    if (!$secret || $req_tok !== $secret) {
        http_response_code(403);
        echo json_encode(['ok'=>false,'error'=>'Forbidden']);
        exit;
    }
    header('Content-Type: application/json');
}

$refresh_token = defined('GOOGLE_REFRESH_TOKEN') ? GOOGLE_REFRESH_TOKEN : '';
$oauth_cid     = defined('GOOGLE_CLIENT_ID')     ? GOOGLE_CLIENT_ID     : '';
$oauth_cs      = defined('GOOGLE_CLIENT_SECRET') ? GOOGLE_CLIENT_SECRET : '';
$admin_email   = defined('DIMARK_EMAIL')          ? DIMARK_EMAIL         : 'info@dimark.co';

$log = [];
$ok  = false;

if (!$refresh_token || !$oauth_cid || !$oauth_cs) {
    $log[] = 'ERROR: Credenciales Google OAuth no configuradas';
} else {
    // Obtener access token
    $ch = curl_init('https://oauth2.googleapis.com/token');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_TIMEOUT        => 15,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_POSTFIELDS     => http_build_query([
            'client_id'     => $oauth_cid,
            'client_secret' => $oauth_cs,
            'refresh_token' => $refresh_token,
            'grant_type'    => 'refresh_token',
        ]),
    ]);
    $raw  = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $err  = curl_errno($ch);
    curl_close($ch);

    if ($err) {
        $log[] = "ERROR: curl falló (errno $err)";
    } elseif ($code !== 200) {
        $body = json_decode($raw, true);
        $msg  = $body['error_description'] ?? $body['error'] ?? "HTTP $code";
        $log[] = "ERROR: Token inválido o revocado — $msg";
    } else {
        $body  = json_decode($raw, true);
        $token = $body['access_token'] ?? '';
        if ($token) {
            $ok = true;
            $log[] = 'OK: access_token obtenido correctamente';

            // Verificación ligera con API Google Ads
            $dev_token = defined('GOOGLE_DEV_TOKEN') ? GOOGLE_DEV_TOKEN : '';
            $mcc       = defined('GOOGLE_MCC_ID')    ? preg_replace('/[^0-9]/', '', GOOGLE_MCC_ID) : '';
            if ($dev_token) {
                $h2 = ['Authorization: Bearer '.$token,'developer-token: '.$dev_token,'Content-Type: application/json'];
                if ($mcc) $h2[] = 'login-customer-id: '.$mcc;
                $ch2 = curl_init('https://googleads.googleapis.com/v20/customers:listAccessibleCustomers');
                curl_setopt_array($ch2, [CURLOPT_RETURNTRANSFER=>true,CURLOPT_HTTPHEADER=>$h2,CURLOPT_TIMEOUT=>10,CURLOPT_SSL_VERIFYPEER=>false]);
                $raw2  = curl_exec($ch2);
                $code2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
                curl_close($ch2);
                if ($code2 === 200) {
                    $n = count((json_decode($raw2,true)['resourceNames'] ?? []));
                    $log[] = "API Google Ads accesible — $n cuentas disponibles";
                } else {
                    $log[] = "WARN: API Google Ads respondió HTTP $code2";
                }
            }
        } else {
            $log[] = 'ERROR: No se recibió access_token en la respuesta';
        }
    }
}

$date_str = date('Y-m-d H:i:s');
$status   = $ok ? 'OK' : 'FALLO';

// ── Guardar en base de datos ──────────────────────────────────────────────────
try {
    $pdo->exec("CREATE TABLE IF NOT EXISTS dm_token_monitor (
        id INT AUTO_INCREMENT PRIMARY KEY,
        service VARCHAR(32) NOT NULL DEFAULT 'google',
        status VARCHAR(10) NOT NULL,
        message TEXT,
        checked_at DATETIME NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
    $pdo->prepare("INSERT INTO dm_token_monitor (service, status, message, checked_at) VALUES (?,?,?,NOW())")
        ->execute(['google', $status, implode(' | ', $log)]);
    // Mantener solo últimos 90 registros
    $pdo->exec("DELETE FROM dm_token_monitor WHERE id NOT IN (SELECT id FROM (SELECT id FROM dm_token_monitor ORDER BY id DESC LIMIT 90) t)");
} catch (Exception $e) {
    $log[] = "DB: " . $e->getMessage();
}

// ── Email de alerta si falla ──────────────────────────────────────────────────
if (!$ok) {
    $subject = "=?UTF-8?B?" . base64_encode("[ALERTA] Token Google Ads inválido — $date_str") . "?=";
    $body    = "El monitor automático de SuperCerebro detectó un problema con el token de Google Ads.\n\n"
             . "Fecha: $date_str\n"
             . "Estado: $status\n"
             . "Detalle:\n" . implode("\n", array_map(fn($l) => "  » $l", $log)) . "\n\n"
             . "ACCIÓN REQUERIDA:\n"
             . "1. Abre SuperCerebro → ⚙ APIs → Google Ads\n"
             . "2. Clic en 'Reconectar cuenta Google'\n"
             . "3. Autoriza nuevamente con tu cuenta de Google\n\n"
             . "-- Monitor automático SuperCerebro DIMARK";
    $headers = "From: SuperCerebro Monitor <no-reply@dimark.co>\r\n"
             . "Reply-To: $admin_email\r\n"
             . "Content-Type: text/plain; charset=UTF-8";
    @mail($admin_email, $subject, $body, $headers);
    $log[] = "Email de alerta enviado a: $admin_email";
}

// ── Output ────────────────────────────────────────────────────────────────────
if ($is_cli) {
    echo "[$date_str] Google Token Monitor: $status\n";
    foreach ($log as $l) echo "  » $l\n";
    exit($ok ? 0 : 1);
} else {
    echo json_encode(['ok'=>$ok,'status'=>$status,'log'=>$log,'checked_at'=>$date_str]);
}
