<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\Amministratore;
use Spatie\Permission\Models\Role;

class TestRoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // Crea i ruoli se non esistono
        $superAdminRole = Role::firstOrCreate(['name' => 'super-admin']);
        $adminRole = Role::firstOrCreate(['name' => 'amministratore']);
        $condominoRole = Role::firstOrCreate(['name' => 'condomino']);

        echo "✅ Ruoli creati: super-admin, amministratore, condomino\n";

        // Crea l'utente Super Admin
        $superAdminUser = User::updateOrCreate([
            'email' => 'superadmin@netgescon.local'
        ], [
            'name' => 'Super Administrator',
            'email_verified_at' => now(),
            'password' => Hash::make('SuperAdminNetGesCon2025!'),
        ]);

        // Assegna il ruolo
        $superAdminUser->assignRole('super-admin');
        
        echo "✅ Super Admin User creato: {$superAdminUser->email}\n";

        // Crea l'amministratore associato con codice non prevedibile
        $adminCode = $this->generateSecureAdminCode();
        
        $amministratore = Amministratore::updateOrCreate([
            'user_id' => $superAdminUser->id
        ], [
            'codice_univoco' => $adminCode,
            'nome' => 'Super',
            'cognome' => 'Administrator',
            'denominazione_studio' => 'NetGesCon System Administration',
            'email_studio' => 'superadmin@netgescon.local',
        ]);

        echo "✅ Amministratore creato con codice: {$adminCode}\n";
        echo "🎯 Accesso URL: http://127.0.0.1:8000/{$adminCode}\n";
    }

    /**
     * Genera un codice amministratore sicuro e non prevedibile
     */
    private function generateSecureAdminCode(): string
    {
        // Per produzione: genera codice random sicuro
        // Per sviluppo: usa un codice riconoscibile ma non ovvio
        if (app()->environment('production')) {
            do {
                $codice = strtoupper(substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 8));
            } while (Amministratore::where('codice_univoco', $codice)->exists());
        } else {
            // Codice per sviluppo: non inizia con A per evitare pattern prevedibili
            $codice = 'SA' . strtoupper(substr(str_shuffle('BCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 6));
        }
        
        return $codice;
    }
}
