<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // Approccio alternativo: modificare la colonna per avere un valore di default
        // e creare una stored procedure per generare il codice
        
        // Prima, creiamo una stored procedure per generare il codice univoco
        DB::unprepared('DROP PROCEDURE IF EXISTS generate_codice_univoco');
        
        try {
            DB::unprepared('
                CREATE PROCEDURE generate_codice_univoco(IN table_name VARCHAR(50), OUT codice VARCHAR(8))
                BEGIN
                    DECLARE codice_temp VARCHAR(8);
                    DECLARE codice_exists INT DEFAULT 1;
                    
                    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)
                        );
                        
                        IF table_name = "amministratori" THEN
                            SELECT COUNT(*) INTO codice_exists FROM amministratori WHERE codice_univoco = codice_temp;
                        ELSEIF table_name = "users" THEN
                            SELECT COUNT(*) INTO codice_exists FROM users WHERE codice_univoco = codice_temp;
                        END IF;
                    END WHILE;
                    
                    SET codice = codice_temp;
                END
            ');
            
            echo "Stored procedure creata con successo.\n";
        } catch (\Exception $e) {
            echo "Errore nella creazione della stored procedure: " . $e->getMessage() . "\n";
        }
        
        // Aggiornare i record esistenti che non hanno codice_univoco
        try {
            // Per amministratori
            $amministratori = DB::table('amministratori')->whereNull('codice_univoco')->orWhere('codice_univoco', '')->get();
            foreach ($amministratori as $admin) {
                $codice = $this->generateCodiceUnivocoPhp('amministratori');
                DB::table('amministratori')->where('id', $admin->id)->update(['codice_univoco' => $codice]);
            }
            
            // Per users (se la colonna esiste)
            if (DB::getSchemaBuilder()->hasColumn('users', 'codice_univoco')) {
                $users = DB::table('users')->whereNull('codice_univoco')->orWhere('codice_univoco', '')->get();
                foreach ($users as $user) {
                    $codice = $this->generateCodiceUnivocoPhp('users');
                    DB::table('users')->where('id', $user->id)->update(['codice_univoco' => $codice]);
                }
            }
            
            echo "Record esistenti aggiornati con successo.\n";
        } catch (\Exception $e) {
            echo "Errore nell'aggiornamento dei record: " . $e->getMessage() . "\n";
        }
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        DB::unprepared('DROP PROCEDURE IF EXISTS generate_codice_univoco');
    }
    
    /**
     * Genera un codice univoco utilizzando PHP
     */
    private function generateCodiceUnivocoPhp(string $table): string
    {
        $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        
        do {
            $codice = '';
            for ($i = 0; $i < 8; $i++) {
                $codice .= $characters[random_int(0, 35)];
            }
            
            $exists = DB::table($table)->where('codice_univoco', $codice)->exists();
        } while ($exists);
        
        return $codice;
    }
};
