<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class PermissionController extends Controller
{
    /**
     * Lista utenti e permessi
     */
    public function index()
    {
        $users = User::with('stabili')->paginate(15);
        $roles = $this->getAvailableRoles();
        
        return view('admin.permissions.index', compact('users', 'roles'));
    }

    /**
     * Mostra form di modifica permessi utente
     */
    public function edit(User $user)
    {
        $roles = $this->getAvailableRoles();
        $permissions = $this->getAllPermissions();
        $userPermissions = json_decode($user->custom_permissions ?? '{}', true);
        
        return view('admin.permissions.edit', compact('user', 'roles', 'permissions', 'userPermissions'));
    }

    /**
     * Aggiorna permessi utente
     */
    public function update(Request $request, User $user)
    {
        $request->validate([
            'role' => 'required|in:' . implode(',', array_keys($this->getAvailableRoles())),
            'permissions' => 'array',
            'assigned_stabili' => 'array',
        ]);

        // Aggiorna ruolo
        $user->role = $request->role;

        // Aggiorna permessi personalizzati per collaboratori
        if ($request->role === 'collaboratore') {
            $customPermissions = [];
            if ($request->permissions) {
                foreach ($request->permissions as $permission) {
                    $customPermissions[$permission] = true;
                }
            }
            $user->custom_permissions = json_encode($customPermissions);
        } else {
            $user->custom_permissions = null;
        }

        // Aggiorna stabili assegnati per manutentori
        if ($request->role === 'manutentore' && $request->assigned_stabili) {
            $user->assigned_stabili = json_encode($request->assigned_stabili);
        } else {
            $user->assigned_stabili = null;
        }

        $user->save();

        return redirect()->route('admin.permissions.index')
            ->with('success', 'Permessi aggiornati con successo per ' . $user->name);
    }

    /**
     * Crea nuovo utente con permessi
     */
    public function create()
    {
        $roles = $this->getAvailableRoles();
        $permissions = $this->getAllPermissions();
        
        return view('admin.permissions.create', compact('roles', 'permissions'));
    }

    /**
     * Salva nuovo utente
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
            'role' => 'required|in:' . implode(',', array_keys($this->getAvailableRoles())),
            'permissions' => 'array',
            'assigned_stabili' => 'array',
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'role' => $request->role,
        ]);

        // Gestione permessi personalizzati
        if ($request->role === 'collaboratore' && $request->permissions) {
            $customPermissions = [];
            foreach ($request->permissions as $permission) {
                $customPermissions[$permission] = true;
            }
            $user->custom_permissions = json_encode($customPermissions);
        }

        // Gestione stabili assegnati
        if ($request->role === 'manutentore' && $request->assigned_stabili) {
            $user->assigned_stabili = json_encode($request->assigned_stabili);
        }

        $user->save();

        return redirect()->route('admin.permissions.index')
            ->with('success', 'Utente creato con successo: ' . $user->name);
    }

    /**
     * Impersonifica utente (solo super admin)
     */
    public function impersonate(User $user)
    {
        if (auth()->user()->role !== 'super_admin') {
            abort(403, 'Non autorizzato');
        }

        session(['impersonating' => $user->id]);
        session(['original_user' => auth()->id()]);

        auth()->login($user);

        return redirect()->route('dashboard')
            ->with('warning', 'Stai impersonificando: ' . $user->name . '. Clicca per tornare al tuo account.');
    }

    /**
     * Termina impersonificazione
     */
    public function stopImpersonating()
    {
        if (!session('impersonating')) {
            return redirect()->route('dashboard');
        }

        $originalUserId = session('original_user');
        session()->forget(['impersonating', 'original_user']);

        if ($originalUserId) {
            $originalUser = User::find($originalUserId);
            if ($originalUser) {
                auth()->login($originalUser);
            }
        }

        return redirect()->route('admin.permissions.index')
            ->with('success', 'Impersonificazione terminata');
    }

    /**
     * Ruoli disponibili nel sistema
     */
    private function getAvailableRoles()
    {
        return [
            'user' => 'Utente Base',
            'collaboratore' => 'Collaboratore (Permessi Personalizzati)',
            'contabile' => 'Responsabile Contabilità',
            'fatture_acquisto' => 'Gestione Fatture Acquisto',
            'fatture_emesse' => 'Gestione Fatture Emesse',
            'rate_manager' => 'Gestione Rate e Pagamenti',
            'assemblee_manager' => 'Gestione Assemblee',
            'manutentore' => 'Manutentore',
            'amministratore' => 'Amministratore',
            'super_admin' => 'Super Amministratore',
        ];
    }

    /**
     * Tutti i permessi disponibili
     */
    private function getAllPermissions()
    {
        return [
            'dashboard' => 'Dashboard',
            'stabili' => 'Gestione Stabili',
            'unita' => 'Unità Immobiliari',
            'soggetti' => 'Gestione Soggetti',
            'contabilita' => 'Contabilità',
            'fatture_acquisto' => 'Fatture Acquisto',
            'fatture_emesse' => 'Fatture Emesse',
            'rate' => 'Gestione Rate',
            'assemblee' => 'Assemblee',
            'rubrica' => 'Rubrica',
            'calendario' => 'Calendario',
            'manutentori' => 'Area Manutentori',
            'xml_fatture' => 'Preparazione XML Fatture',
            'amministrazione' => 'Amministrazione',
            'gestione_permessi' => 'Gestione Permessi Utenti',
        ];
    }
}
