<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // Verifica se abbiamo i privilegi per creare trigger
        try {
            DB::unprepared('SET SESSION log_bin_trust_function_creators = 1');
            $canCreateTriggers = true;
        } catch (\Exception $e) {
            $canCreateTriggers = false;
            echo "⚠️  Non è possibile creare trigger MySQL - verrà usato Observer Laravel\n";
        }

        if ($canCreateTriggers) {
            // Trigger per amministratori - genera codice univoco automaticamente
            DB::unprepared('DROP TRIGGER IF EXISTS generate_codice_univoco_amministratori');
            
            try {
                DB::unprepared('
                    CREATE TRIGGER generate_codice_univoco_amministratori
                    BEFORE INSERT ON amministratori
                    FOR EACH ROW
                    BEGIN
                        DECLARE codice_temp VARCHAR(8);
                        DECLARE codice_exists INT DEFAULT 1;
                        
                        -- Solo se il codice non è già fornito
                        IF NEW.codice_univoco IS NULL OR NEW.codice_univoco = "" THEN
                            WHILE codice_exists > 0 DO
                                SET codice_temp = CONCAT(
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1)
                                );
                                
                                SELECT COUNT(*) INTO codice_exists 
                                FROM amministratori 
                                WHERE codice_univoco = codice_temp;
                            END WHILE;
                            
                            SET NEW.codice_univoco = codice_temp;
                        END IF;
                    END
                ');
                
                echo "✅ Trigger amministratori creato con successo\n";
            } catch (\Exception $e) {
                echo "⚠️  Errore creazione trigger amministratori - verrà usato Observer Laravel\n";
            }

            // Trigger per users - genera codice univoco automaticamente
            DB::unprepared('DROP TRIGGER IF EXISTS generate_codice_univoco_users');
            
            try {
                DB::unprepared('
                    CREATE TRIGGER generate_codice_univoco_users
                    BEFORE INSERT ON users
                    FOR EACH ROW
                    BEGIN
                        DECLARE codice_temp VARCHAR(8);
                        DECLARE codice_exists INT DEFAULT 1;
                        
                        -- Solo se il codice non è già fornito e se la colonna esiste
                        IF NEW.codice_univoco IS NULL OR NEW.codice_univoco = "" THEN
                            WHILE codice_exists > 0 DO
                                SET codice_temp = CONCAT(
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1),
                                    SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1)
                                );
                                
                                SELECT COUNT(*) INTO codice_exists 
                                FROM users 
                                WHERE codice_univoco = codice_temp;
                            END WHILE;
                            
                            SET NEW.codice_univoco = codice_temp;
                        END IF;
                    END
                ');
                
                echo "✅ Trigger users creato con successo\n";
            } catch (\Exception $e) {
                echo "⚠️  Errore creazione trigger users - verrà usato Observer Laravel\n";
            }
        }
        
        echo "ℹ️  Generazione codici univoci gestita da Observer Laravel\n";
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        DB::unprepared('DROP TRIGGER IF EXISTS generate_codice_univoco_amministratori');
        DB::unprepared('DROP TRIGGER IF EXISTS generate_codice_univoco_users');
    }
};
