<?php

declare(strict_types=1);

/**
 * Tüm üyelerin Telegram doğrulamasını sıfırlar (yeni bot ile yeniden doğrulama için).
 *
 * Kullanım:
 *   php scripts/reset-telegram-verification.php --dry-run
 *   php scripts/reset-telegram-verification.php --yes
 *   php scripts/reset-telegram-verification.php --yes --include-invites
 */

if (PHP_SAPI !== 'cli') {
    fwrite(STDERR, "Bu betik yalnızca CLI ile çalışır.\n");
    exit(1);
}

require_once dirname(__DIR__) . '/api/db.php';

$argv = $argv ?? [];
$dryRun = in_array('--dry-run', $argv, true);
$force = in_array('--yes', $argv, true);
$includeInvites = in_array('--include-invites', $argv, true);

$dbPath = mocker_db_path();

if (!is_file($dbPath)) {
    fwrite(STDERR, "Veritabanı bulunamadı: {$dbPath}\n");
    exit(1);
}

$pdo = new PDO('sqlite:' . $dbPath, null, null, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$pdo->exec('PRAGMA foreign_keys = ON');

function count_query(PDO $pdo, string $sql): int
{
    return (int) $pdo->query($sql)->fetchColumn();
}

$stats = [
    'users_total' => count_query($pdo, 'SELECT COUNT(*) FROM users'),
    'users_verified' => count_query(
        $pdo,
        'SELECT COUNT(*) FROM users WHERE telegram_verified_at IS NOT NULL AND telegram_verified_at > 0'
    ),
    'users_with_tg_id' => count_query(
        $pdo,
        'SELECT COUNT(*) FROM users WHERE telegram_user_id IS NOT NULL'
    ),
    'users_pending' => count_query(
        $pdo,
        'SELECT COUNT(*) FROM users WHERE telegram_pending_token_hash IS NOT NULL'
    ),
    'bot_subscribers' => count_query($pdo, 'SELECT COUNT(*) FROM telegram_bot_subscribers'),
    'auth_pending' => count_query($pdo, 'SELECT COUNT(*) FROM telegram_auth_pending'),
];

$inviteStats = ['links' => 0, 'events' => 0];
try {
    $inviteStats['links'] = count_query($pdo, 'SELECT COUNT(*) FROM telegram_invite_links');
    $inviteStats['events'] = count_query($pdo, 'SELECT COUNT(*) FROM telegram_invite_events');
} catch (Throwable $e) {
    // tablolar yoksa atla
}

echo "Veritabanı: {$dbPath}\n";
echo "Üye sayısı: {$stats['users_total']}\n";
echo "Doğrulanmış Telegram: {$stats['users_verified']}\n";
echo "telegram_user_id dolu: {$stats['users_with_tg_id']}\n";
echo "Bekleyen doğrulama tokenı: {$stats['users_pending']}\n";
echo "Eski bot aboneleri: {$stats['bot_subscribers']}\n";
echo "telegram_auth_pending: {$stats['auth_pending']}\n";
if ($inviteStats['links'] > 0 || $inviteStats['events'] > 0) {
    echo "Davet linkleri: {$inviteStats['links']}, davet olayları: {$inviteStats['events']}\n";
}

if ($dryRun) {
    echo "\n--dry-run: değişiklik yapılmadı.\n";
    echo "Uygulamak için: php scripts/reset-telegram-verification.php --yes\n";
    if ($inviteStats['links'] > 0) {
        echo "Davet verisini de silmek için: ... --yes --include-invites\n";
    }
    exit(0);
}

if (!$force) {
    fwrite(STDERR, "\nOnay için --yes ekleyin (ör. php scripts/reset-telegram-verification.php --yes)\n");
    exit(1);
}

$pdo->beginTransaction();
try {
    $upd = $pdo->exec(
        'UPDATE users SET
            telegram_user_id = NULL,
            telegram_username = NULL,
            telegram_verified_at = NULL,
            telegram_pending_token_hash = NULL,
            telegram_pending_expires = NULL'
    );

    $pdo->exec('DELETE FROM telegram_bot_subscribers');
    $pdo->exec('DELETE FROM telegram_auth_pending');

    $invitesCleared = false;
    if ($includeInvites) {
        try {
            $pdo->exec('DELETE FROM telegram_invite_events');
            $pdo->exec('DELETE FROM telegram_invite_links');
            $invitesCleared = true;
        } catch (Throwable $e) {
            throw new RuntimeException('Davet tabloları temizlenemedi: ' . $e->getMessage(), 0, $e);
        }
    }

    $pdo->commit();

    echo "\nTamamlandı.\n";
    echo "Güncellenen users satırı: " . (int) $upd . "\n";
    echo "telegram_bot_subscribers ve telegram_auth_pending temizlendi.\n";
    if ($invitesCleared) {
        echo "telegram_invite_links ve telegram_invite_events temizlendi.\n";
    } elseif ($inviteStats['links'] > 0) {
        echo "Not: Eski davet linkleri duruyor. Silmek için --include-invites ile tekrar çalıştırın.\n";
    }
    echo "\nÜyeler siteye girip yeni bot ile Telegram doğrulamasını yeniden yapabilir.\n";
    echo ".env içinde TELEGRAM_BOT_TOKEN ve bot kullanıcı adının yeni bota işaret ettiğinden emin olun.\n";
} catch (Throwable $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    fwrite(STDERR, 'Hata: ' . $e->getMessage() . "\n");
    exit(1);
}
