<?php

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

/**
 * Backup Incremental Strategy — Phase 2.
 *
 * cPanel "Incremental Backups" + Plesk "Smart Backup" muadili.
 *
 * Strateji: rsync `--link-dest=<previous>` hard-link incremental.
 *   - full         → tek başına self-contained tarball/dizin
 *   - incremental  → bir önceki full veya incremental'a referans verir,
 *                   sadece değişen dosyaları kopyalar (hard-link rest of files)
 *
 * Restore akışı:
 *   - full restore: tek dizini açar
 *   - incremental restore: chain'i (full + tüm aradaki incrementals) sırasıyla
 *     rsync merge eder
 *
 * Bu migration:
 *   1. backups.type enum'una 'incremental' ekler
 *   2. parent_backup_id (kendine FK) — incremental hangi backup'a bağlı
 *   3. chain_id — full + tüm incrementals'i gruplayan UUID
 *   4. is_chain_head — chain'in kökü (full) için TRUE
 *   5. backup_schedules.backup_mode — 'full_only' veya 'incremental' (full_frequency_days ile)
 */
return new class extends Migration
{
    public function up(): void
    {
        // 1. backups tablosuna incremental kolonları ekle
        Schema::table('backups', function (Blueprint $table) {
            $table->foreignId('parent_backup_id')
                ->nullable()
                ->after('account_id')
                ->constrained('backups')
                ->nullOnDelete()
                ->comment('Incremental ise: zincirdeki bir önceki backup (full/inc) referansı');

            // char(36) — MariaDB 10.5 native uuid type yok
            $table->char('chain_id', 36)
                ->nullable()
                ->after('parent_backup_id')
                ->comment('Aynı full+incremental zincirini gruplar (restore chain için)');

            $table->boolean('is_chain_head')
                ->default(false)
                ->after('chain_id')
                ->comment('TRUE = chain başlangıcı (her zaman bir full)');

            $table->unsignedInteger('chain_position')
                ->default(0)
                ->after('is_chain_head')
                ->comment('Zincirdeki sıra: 0=full, 1=ilk inc, 2=ikinci inc...');

            $table->index('chain_id');
            $table->index('parent_backup_id');
        });

        // 2. backups.type enum'unu MODIFY ile genişlet.
        //    MySQL/MariaDB: raw ALTER MODIFY ENUM (Laravel enum diff desteklemiyor).
        //    SQLite/PostgreSQL: ENUM yok, varchar+check; ekstra DDL gerekmez.
        $driver = DB::connection()->getDriverName();
        if ($driver === 'mysql' || $driver === 'mariadb') {
            DB::statement(
                "ALTER TABLE `backups` MODIFY COLUMN `type` ENUM('full','home','databases','dns','incremental') NOT NULL DEFAULT 'full'"
            );
        }
        // SQLite: type kolonu zaten varchar — yeni değer ('incremental') zaten kabul edilir.
        // PostgreSQL: enum type'a yeni değer ALTER TYPE ile eklenebilir; production'da MySQL hedef
        // olduğu için şimdilik atlandı.

        // 3. backup_schedules tablosuna incremental konfigürasyonu ekle
        Schema::table('backup_schedules', function (Blueprint $table) {
            $table->enum('backup_mode', ['full_only', 'incremental'])
                ->default('full_only')
                ->after('scope')
                ->comment('full_only: her run full / incremental: full_frequency_days kadar full + arası inc');

            $table->unsignedSmallInteger('full_frequency_days')
                ->default(7)
                ->after('backup_mode')
                ->comment('Incremental mode: kaç günde bir full alınacak (örn. 7 = haftalık full + günlük inc)');

            $table->unsignedSmallInteger('max_chain_length')
                ->default(14)
                ->after('full_frequency_days')
                ->comment('Bir chain en fazla kaç incremental içerebilir (sonra zorla full)');
        });
    }

    public function down(): void
    {
        Schema::table('backups', function (Blueprint $table) {
            $table->dropConstrainedForeignId('parent_backup_id');
            $table->dropIndex(['chain_id']);
            $table->dropColumn(['chain_id', 'is_chain_head', 'chain_position']);
        });

        $driver = DB::connection()->getDriverName();
        if ($driver === 'mysql' || $driver === 'mariadb') {
            DB::statement(
                "ALTER TABLE `backups` MODIFY COLUMN `type` ENUM('full','home','databases','dns') NOT NULL DEFAULT 'full'"
            );
        }

        Schema::table('backup_schedules', function (Blueprint $table) {
            $table->dropColumn(['backup_mode', 'full_frequency_days', 'max_chain_length']);
        });
    }
};
