<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    private function indexExists(string $table, string $indexName): bool
    {
        $result = \DB::select("SHOW INDEX FROM `{$table}` WHERE Key_name = ?", [$indexName]);
        return count($result) > 0;
    }

    private function foreignKeyExists(string $table, string $fkName): bool
    {
        $result = \DB::select(
            "SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
             WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND CONSTRAINT_NAME = ? AND CONSTRAINT_TYPE = 'FOREIGN KEY'",
            [$table, $fkName]
        );
        return count($result) > 0;
    }

    public function up(): void
    {
        // Skip jika table tak ada column tahun (new migration akan recreate)
        if (!Schema::hasColumn('maklumat_buku_darjah', 'tahun')) {
            return;
        }

        // Buang data lama (format agregat, tidak serasi dengan struktur per-buku baru)
        \DB::table('maklumat_buku_darjah')->truncate();

        // STEP 1: Tambah index user_id tetap DAHULU (supaya FK user_id tidak putus semasa operasi berikut)
        if (!$this->indexExists('maklumat_buku_darjah', 'idx_mbd_user_id')) {
            \DB::statement('ALTER TABLE maklumat_buku_darjah ADD INDEX `idx_mbd_user_id` (`user_id`)');
        }

        // STEP 2: Buang index/FK lama (sekarang selamat kerana idx_mbd_user_id menggantikan peranan index lama)
        if ($this->foreignKeyExists('maklumat_buku_darjah', 'maklumat_buku_darjah_kod_buku_foreign')) {
            \DB::statement('ALTER TABLE maklumat_buku_darjah DROP FOREIGN KEY `maklumat_buku_darjah_kod_buku_foreign`');
        }
        if ($this->indexExists('maklumat_buku_darjah', 'maklumat_user_tahun_darjah_buku_unique')) {
            \DB::statement('ALTER TABLE maklumat_buku_darjah DROP INDEX `maklumat_user_tahun_darjah_buku_unique`');
        }
        if ($this->indexExists('maklumat_buku_darjah', 'maklumat_user_tahun_darjah_unique')) {
            \DB::statement('ALTER TABLE maklumat_buku_darjah DROP INDEX `maklumat_user_tahun_darjah_unique`');
        }
        if ($this->indexExists('maklumat_buku_darjah', 'tmp_mbd_user_id_idx')) {
            \DB::statement('ALTER TABLE maklumat_buku_darjah DROP INDEX `tmp_mbd_user_id_idx`');
        }

        // STEP 3: Tambah kolum kod_buku jika belum ada
        if (!Schema::hasColumn('maklumat_buku_darjah', 'kod_buku')) {
            Schema::table('maklumat_buku_darjah', function (Blueprint $table) {
                $table->string('kod_buku')->after('darjah');
            });
        }

        // STEP 4: Tambah FK pada kod_buku dan unique key baru
        \DB::statement('ALTER TABLE maklumat_buku_darjah ADD CONSTRAINT `maklumat_buku_darjah_kod_buku_foreign` FOREIGN KEY (`kod_buku`) REFERENCES `buku` (`kod_buku`) ON DELETE CASCADE');
        \DB::statement('ALTER TABLE maklumat_buku_darjah ADD UNIQUE KEY `maklumat_user_tahun_darjah_buku_unique` (`user_id`, `tahun`, `darjah`, `kod_buku`)');
    }

    public function down(): void
    {
        Schema::table('maklumat_buku_darjah', function (Blueprint $table) {
            $table->dropForeign(['kod_buku']);
            $table->dropUnique('maklumat_user_tahun_darjah_buku_unique');
            $table->dropColumn('kod_buku');
            $table->unique(['user_id', 'tahun', 'darjah'], 'maklumat_user_tahun_darjah_unique');
        });
    }
};
