#!/usr/bin/env php
<?php
// CIUS - php cius <komut> [opsiyonlar]

require_once __DIR__ . '/cekirdek/config.php';

$komutlar = [
    'serve'          => 'PHP gelistirme sunucusunu baslatir (varsayilan: localhost:8080)',
    'migrate'        => 'Migration dosyalarini calistirir',
    'migrate:fresh'  => 'DB sifirlar + migration tekrar calistirir (--seed ile seed de ekler)',
    'migrate:status' => 'Hangi migration\'larin calistigini gosterir',
    'seed'           => 'Seed dosyalarini calistirir',
    'db:reset'       => 'SQLite DB dosyasini siler (sadece sqlite)',
    'db:import'      => 'MySQL dump dosyasindan verileri ice aktarir',
];

$komut   = $argv[1] ?? 'help';
$flaglar = array_slice($argv, 2);
$hasSeed = in_array('--seed', $flaglar, true);

function yesil($s)  { return "\033[32m{$s}\033[0m"; }
function kirmizi($s) { return "\033[31m{$s}\033[0m"; }
function sari($s)   { return "\033[33m{$s}\033[0m"; }
function mavi($s)   { return "\033[34m{$s}\033[0m"; }

function banner() {
    echo mavi("CIUS") . " - Veritabani Yonetimi\n\n";
}

// --- HELP ---
if ($komut === 'help' || $komut === '--help' || $komut === '-h') {
    banner();
    echo "Kullanim: php cius <komut> [opsiyonlar]\n\n";
    echo "Komutlar:\n";
    foreach ($GLOBALS['komutlar'] as $k => $aciklama) {
        printf("  %-20s %s\n", sari($k), $aciklama);
    }
    echo "\nOpsiyonlar:\n";
    echo "  --seed              migrate:fresh ile seed de calistirir\n";
    exit(0);
}

// --- Migration tablosu ---
function migration_tablosu_olustur(PDO $db) {
    global $DB_DRIVER;
    if ($DB_DRIVER === 'sqlite') {
        $db->exec("CREATE TABLE IF NOT EXISTS _migrations (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            dosya TEXT NOT NULL UNIQUE,
            calisma_zamani TEXT DEFAULT (datetime('now'))
        )");
    } else {
        $db->exec("CREATE TABLE IF NOT EXISTS _migrations (
            id INT AUTO_INCREMENT PRIMARY KEY,
            dosya VARCHAR(255) NOT NULL UNIQUE,
            calisma_zamani TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
    }
}

function calismis_migrationlar(PDO $db): array {
    try {
        return array_column($db->query("SELECT dosya FROM _migrations ORDER BY id")->fetchAll(), 'dosya');
    } catch (Throwable $e) {
        return [];
    }
}

function migration_dosyalari(): array {
    global $DB_DRIVER;
    $dir = __DIR__ . '/database/migrations';
    if (!is_dir($dir)) return [];
    $files = glob($dir . '/*.sql');
    sort($files);
    // Driver ayrimi:
    //   *.mysql.sql  -> sadece mysql modunda
    //   *.sqlite.sql -> sadece sqlite modunda
    //   *.sql        -> generic; default sqlite syntax (001 vs).
    $isMySQL = ($DB_DRIVER === 'mysql');
    return array_values(array_filter($files, function($f) use ($isMySQL) {
        $isMySQLSpecific  = (substr($f, -10) === '.mysql.sql');
        $isSQLiteSpecific = (substr($f, -11) === '.sqlite.sql');
        if ($isMySQL)  return $isMySQLSpecific  && !$isSQLiteSpecific;
        else           return !$isMySQLSpecific;
    }));
}

function seed_dosyalari(): array {
    $dir = __DIR__ . '/database/seeds';
    if (!is_dir($dir)) return [];
    $files = glob($dir . '/*.sql');
    sort($files);
    return $files;
}

function sql_calistir(PDO $db, string $dosya_yolu) {
    $sql = file_get_contents($dosya_yolu);
    if (empty(trim($sql))) return;
    $db->exec($sql);
}

// --- MIGRATE ---
if ($komut === 'migrate') {
    banner();
    migration_tablosu_olustur($db);
    $calismis = calismis_migrationlar($db);
    $dosyalar = migration_dosyalari();
    $yeni = 0;

    foreach ($dosyalar as $yol) {
        $ad = basename($yol);
        if (in_array($ad, $calismis, true)) continue;

        echo "  Calistiriliyor: " . sari($ad) . " ... ";
        try {
            sql_calistir($db, $yol);
            $db->prepare("INSERT INTO _migrations (dosya) VALUES (?)")->execute([$ad]);
            echo yesil("OK") . "\n";
            $yeni++;
        } catch (Throwable $e) {
            echo kirmizi("HATA") . "\n";
            echo "  " . $e->getMessage() . "\n";
            exit(1);
        }
    }

    if ($yeni === 0) {
        echo yesil("  Tum migration'lar guncel.") . "\n";
    } else {
        echo "\n" . yesil("  {$yeni} migration calistirildi.") . "\n";
    }
    exit(0);
}

// --- MIGRATE:FRESH ---
if ($komut === 'migrate:fresh') {
    banner();

    if ($DB_DRIVER === 'sqlite') {
        $tables = $db->query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")->fetchAll();
        $db->exec('PRAGMA foreign_keys=OFF');
        foreach ($tables as $t) {
            $db->exec('DROP TABLE IF EXISTS "' . $t['name'] . '"');
        }
        $db->exec('PRAGMA foreign_keys=ON');
        echo yesil("  Tum tablolar silindi (SQLite).") . "\n";
    } else {
        $db->exec('SET FOREIGN_KEY_CHECKS=0');
        $tables = $db->query('SHOW TABLES')->fetchAll(PDO::FETCH_NUM);
        foreach ($tables as $t) {
            $db->exec('DROP TABLE IF EXISTS `' . $t[0] . '`');
        }
        $db->exec('SET FOREIGN_KEY_CHECKS=1');
        echo yesil("  Tum tablolar silindi (MySQL).") . "\n";
    }

    migration_tablosu_olustur($db);
    $dosyalar = migration_dosyalari();
    $yeni = 0;

    foreach ($dosyalar as $yol) {
        $ad = basename($yol);
        echo "  Calistiriliyor: " . sari($ad) . " ... ";
        try {
            sql_calistir($db, $yol);
            $db->prepare("INSERT INTO _migrations (dosya) VALUES (?)")->execute([$ad]);
            echo yesil("OK") . "\n";
            $yeni++;
        } catch (Throwable $e) {
            echo kirmizi("HATA") . "\n";
            echo "  " . $e->getMessage() . "\n";
            exit(1);
        }
    }
    echo yesil("  {$yeni} migration calistirildi.") . "\n";

    if ($hasSeed) {
        echo "\n";
        $sifre = password_hash('admin123', PASSWORD_DEFAULT);
        if ($DB_DRIVER === 'sqlite') {
            $db->prepare("INSERT OR IGNORE INTO kullanicilar (ad_soyad, kullanici_adi, sifre_hash, rol) VALUES ('Admin', 'admin', ?, 'yonetici')")->execute([$sifre]);
        } else {
            $db->prepare("INSERT IGNORE INTO kullanicilar (ad_soyad, kullanici_adi, sifre_hash, rol) VALUES ('Admin', 'admin', ?, 'yonetici')")->execute([$sifre]);
        }
        echo "  " . yesil("Admin kullanici olusturuldu") . " (admin / admin123)\n";

        foreach (seed_dosyalari() as $yol) {
            $ad = basename($yol);
            echo "  Seed: " . sari($ad) . " ... ";
            try {
                sql_calistir($db, $yol);
                echo yesil("OK") . "\n";
            } catch (Throwable $e) {
                echo kirmizi("HATA") . "\n";
                echo "  " . $e->getMessage() . "\n";
            }
        }
    }
    exit(0);
}

// --- MIGRATE:STATUS ---
if ($komut === 'migrate:status') {
    banner();
    migration_tablosu_olustur($db);
    $calismis = calismis_migrationlar($db);
    $dosyalar = migration_dosyalari();

    if (empty($dosyalar)) {
        echo "  Migration dosyasi bulunamadi.\n";
        exit(0);
    }

    printf("  %-6s %-50s %s\n", "Durum", "Dosya", "");
    echo "  " . str_repeat('-', 70) . "\n";

    foreach ($dosyalar as $yol) {
        $ad = basename($yol);
        if (in_array($ad, $calismis, true)) {
            $zaman = $db->prepare("SELECT calisma_zamani FROM _migrations WHERE dosya=?");
            $zaman->execute([$ad]);
            $z = $zaman->fetchColumn() ?: '';
            printf("  %-15s %-50s %s\n", yesil("[OK]"), $ad, $z);
        } else {
            printf("  %-15s %-50s %s\n", sari("[BEKLIYOR]"), $ad, "");
        }
    }
    exit(0);
}

// --- SEED ---
if ($komut === 'seed') {
    banner();
    $dosyalar = seed_dosyalari();
    if (empty($dosyalar)) {
        echo "  Seed dosyasi bulunamadi.\n";
        exit(0);
    }
    foreach ($dosyalar as $yol) {
        $ad = basename($yol);
        echo "  Seed: " . sari($ad) . " ... ";
        try {
            sql_calistir($db, $yol);
            echo yesil("OK") . "\n";
        } catch (Throwable $e) {
            echo kirmizi("HATA") . "\n";
            echo "  " . $e->getMessage() . "\n";
        }
    }
    exit(0);
}

// --- DB:RESET ---
if ($komut === 'db:reset') {
    banner();
    if ($DB_DRIVER !== 'sqlite') {
        echo kirmizi("  db:reset sadece SQLite modunda calisir.") . "\n";
        exit(1);
    }
    $path = __DIR__ . '/database/local.db';
    $db = null;
    foreach (glob($path . '*') as $f) {
        unlink($f);
        echo "  Silindi: " . basename($f) . "\n";
    }
    echo yesil("  DB sifirlandi. 'php cius migrate:fresh --seed' ile yeniden olusturun.") . "\n";
    exit(0);
}

// --- DB:IMPORT ---
if ($komut === 'db:import') {
    banner();
    $dump_path = null;
    foreach ($flaglar as $f) {
        if (strpos($f, '--') !== 0 && file_exists($f)) { $dump_path = $f; break; }
        if (strpos($f, '--file=') === 0) { $dump_path = substr($f, 7); break; }
    }
    if (!$dump_path) $dump_path = __DIR__ . '/database/gskorg_pangisk.sql';
    if (!file_exists($dump_path)) {
        echo kirmizi("  Dosya bulunamadi: {$dump_path}") . "\n"; exit(1);
    }
    echo "  Kaynak: " . sari(basename($dump_path)) . "\n";

    $handle = fopen($dump_path, 'r');
    if (!$handle) { echo kirmizi("  Dosya acilamadi.") . "\n"; exit(1); }

    $isSqlite = ($DB_DRIVER === 'sqlite');
    $tablo_sirasi = [
        'kulup_ayarlar','kullanicilar','oyuncu_gruplar','belge_turleri',
        'kasa_kategoriler','oyuncular','oyuncu_grup_atama','oyuncu_veliler',
        'oyuncu_beyanlar','oyuncu_belgeler','devam_paylasimlar',
        'devam_paylasim_gruplar','devam_kayitlari','kasa_hareketler',
        'aidat_borclar','aidat_tahsilatlar','veli_sifre_tokens',
    ];

    $inserts = [];
    $current_sql = '';
    $current_table = '';

    while (($line = fgets($handle)) !== false) {
        $trimmed = trim($line);
        if ($trimmed === '' || strpos($trimmed, '--') === 0 || strpos($trimmed, '/*') === 0) continue;

        if (preg_match('/^INSERT INTO `(\w+)`/', $trimmed, $m)) {
            if ($current_sql !== '' && $current_table !== '') {
                $inserts[$current_table][] = $current_sql;
            }
            $current_table = $m[1];
            $current_sql = $trimmed;
            if (substr(rtrim($current_sql), -1) === ';') {
                $inserts[$current_table][] = $current_sql;
                $current_sql = '';
                $current_table = '';
            }
            continue;
        }

        if ($current_sql !== '') {
            $current_sql .= "\n" . $trimmed;
            if (substr(rtrim($trimmed), -1) === ';') {
                $inserts[$current_table][] = $current_sql;
                $current_sql = '';
                $current_table = '';
            }
        }
    }
    if ($current_sql !== '' && $current_table !== '') {
        $inserts[$current_table][] = $current_sql;
    }
    fclose($handle);

    echo "  " . count($inserts) . " tablo verisi bulundu\n\n";

    if ($isSqlite) { $db->exec('PRAGMA foreign_keys=OFF'); }
    else { $db->exec('SET FOREIGN_KEY_CHECKS=0'); }

    $toplam = 0;
    $hatalar = [];

    foreach ($tablo_sirasi as $tablo) {
        if (!isset($inserts[$tablo])) continue;
        $db->exec("DELETE FROM \"{$tablo}\"");
        $tablo_kayit = 0;
        foreach ($inserts[$tablo] as $sql) {
            if ($isSqlite) {
                $sql = str_replace('`', '"', $sql);
                $sql = str_replace('current_timestamp()', "datetime('now')", $sql);
                // MySQL \' escape -> SQLite '' escape
                $sql = str_replace("\\'", "''", $sql);
            }
            try {
                $affected = $db->exec($sql);
                if ($affected !== false) $tablo_kayit += $affected;
            } catch (Throwable $e) {
                $hatalar[] = $tablo . ': ' . substr($e->getMessage(), 0, 120);
            }
        }
        printf("  %-30s %s\n", $tablo, yesil("{$tablo_kayit} kayit"));
        $toplam += $tablo_kayit;
    }

    if ($isSqlite) { $db->exec('PRAGMA foreign_keys=ON'); }
    else { $db->exec('SET FOREIGN_KEY_CHECKS=1'); }

    echo "\n" . yesil("  Toplam: {$toplam} kayit aktarildi.") . "\n";

    if (!empty($hatalar)) {
        echo "\n  " . kirmizi("Hatalar (" . count($hatalar) . "):") . "\n";
        foreach (array_slice($hatalar, 0, 10) as $h) echo "  - {$h}\n";
        if (count($hatalar) > 10) echo "  ... ve " . (count($hatalar) - 10) . " hata daha\n";
    }

    echo "\n";
    $sifre = password_hash('admin123', PASSWORD_DEFAULT);
    $db->prepare("UPDATE kullanicilar SET sifre_hash = ? WHERE kullanici_adi = 'admin'")->execute([$sifre]);
    echo "  " . yesil("Admin sifresi sifirlandi") . " (admin / admin123)\n";
    exit(0);
}

// --- SERVE ---
if ($komut === 'serve') {
    $port = '8080';
    $host = 'localhost';
    foreach ($flaglar as $f) {
        if (strpos($f, '--port=') === 0) $port = substr($f, 7);
        if (strpos($f, '--host=') === 0) $host = substr($f, 7);
    }
    banner();
    echo "  Sunucu baslatiliyor: " . yesil("http://{$host}:{$port}") . "\n";
    echo "  Durdurmak icin: " . sari("Ctrl+C") . "\n\n";
    $root = __DIR__;
    passthru("php -S {$host}:{$port} -t \"{$root}\"");
    exit(0);
}

echo kirmizi("Bilinmeyen komut: {$komut}") . "\n";
echo "Kullanim: php cius help\n";
exit(1);
