<?php
/**
 * seed_meta_demo.php — Registra/actualiza credenciales Meta en tenant_whatsapp.
 *
 * Uso:
 *   # Tenant demo (el primero de la DB), número de prueba hardcodeado
 *   php migrations/seed_meta_demo.php
 *
 *   # Tenant específico con sus propios datos
 *   php migrations/seed_meta_demo.php --tenant=2 --pid=1215781871610651 --waba=2131234881066413
 *
 * Requiere en .env:
 *   META_TEST_TOKEN=EAAxxxx...    (token del número, NUNCA en git)
 *   TOKEN_ENCRYPTION_KEY=...      (clave AES-256-GCM)
 *
 * El token se cifra antes de guardarse. Después de correr este script
 * ya no se necesita META_TEST_TOKEN en runtime.
 */

$appDir = dirname(__DIR__) . '/app';
require_once $appDir . '/db.php';
require_once $appDir . '/services/token_crypto.php';

// ── Parsear argumentos CLI ────────────────────────────────────────────────────
$opts = getopt('', ['tenant:', 'pid:', 'waba:']);

$phoneNumberId = $opts['pid']   ?? '1215781871610651';  // número de prueba por defecto
$wabaId        = $opts['waba']  ?? '2131234881066413';

// ── Validar entorno ───────────────────────────────────────────────────────────
$rawToken = getenv('META_TEST_TOKEN');
if (!$rawToken) {
    fwrite(STDERR, "ERROR: META_TEST_TOKEN no está definido en .env\n");
    fwrite(STDERR, "  Agregar: echo \"META_TEST_TOKEN=EAAxx...\" >> .env\n");
    exit(1);
}

if (!getenv('TOKEN_ENCRYPTION_KEY')) {
    fwrite(STDERR, "ERROR: TOKEN_ENCRYPTION_KEY no está definido en .env\n");
    fwrite(STDERR, "  Generar: php -r \"echo base64_encode(random_bytes(32)) . PHP_EOL;\"\n");
    exit(1);
}

// ── Cifrar el token ───────────────────────────────────────────────────────────
try {
    $encryptedToken = TokenCrypto::encrypt($rawToken);
} catch (Throwable $e) {
    fwrite(STDERR, "ERROR: No se pudo cifrar el token — " . $e->getMessage() . "\n");
    exit(1);
}

// ── Conectar a la DB ──────────────────────────────────────────────────────────
$db = DB::connect();

// Resolver tenant
if (isset($opts['tenant'])) {
    $tenantId = (int) $opts['tenant'];
    $stmt = $db->prepare("SELECT id, name FROM tenants WHERE id = :id LIMIT 1");
    $stmt->execute([':id' => $tenantId]);
    $tenant = $stmt->fetch();
    if (!$tenant) {
        fwrite(STDERR, "ERROR: No existe un tenant con id=$tenantId\n");
        exit(1);
    }
} else {
    // Sin argumento: usar el primer tenant (demo)
    $stmt = $db->prepare("SELECT id, name FROM tenants ORDER BY id ASC LIMIT 1");
    $stmt->execute();
    $tenant = $stmt->fetch();
    if (!$tenant) {
        fwrite(STDERR, "ERROR: No hay tenants en la DB. Completá el onboarding primero.\n");
        exit(1);
    }
}
$tenantId = (int) $tenant['id'];

// ── Upsert en tenant_whatsapp ─────────────────────────────────────────────────
$db->prepare(
    "INSERT INTO tenant_whatsapp
        (tenant_id, provider, phone_number_id, waba_id, access_token, status)
     VALUES (:t, 'meta', :pid, :wid, :tok, 'active')
     ON DUPLICATE KEY UPDATE
        tenant_id    = VALUES(tenant_id),
        waba_id      = VALUES(waba_id),
        access_token = VALUES(access_token),
        status       = VALUES(status)"
)->execute([
    ':t'   => $tenantId,
    ':pid' => $phoneNumberId,
    ':wid' => $wabaId,
    ':tok' => $encryptedToken,
]);

echo "OK: tenant_whatsapp seed completado.\n";
echo "    tenant_id      = $tenantId ({$tenant['name']})\n";
echo "    phone_number_id= $phoneNumberId\n";
echo "    waba_id        = $wabaId\n";
echo "    access_token   = [cifrado]\n";
