<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\ActivityLog;
use App\Models\RolePreset;
use App\Models\User;
use Illuminate\Http\Request;

class RuoloController extends Controller
{
    public function index()
    {
        $ruoli = RolePreset::withCount('users')->get();
        return view('admin.ruoli.index', compact('ruoli'));
    }

    public function create()
    {
        return view('admin.ruoli.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:50|unique:role_presets,name',
            'description' => 'nullable|string|max:255',
            'permissions' => 'required|array',
            'permissions.*' => 'in:0,1,2',
        ]);

        $ruolo = RolePreset::create([
            'name' => $validated['name'],
            'description' => $validated['description'] ?? null,
            'permissions' => $validated['permissions'],
        ]);

        ActivityLog::log('create', 'ruoli', 'Creato ruolo: ' . $ruolo->name, [
            'role_id' => $ruolo->id,
            'permissions' => $validated['permissions'],
        ]);

        return redirect('/admin/ruoli')->with('success', 'Ruolo creato.');
    }

    public function edit($id)
    {
        $ruolo = RolePreset::findOrFail($id);
        $usersCount = $ruolo->users()->count();
        return view('admin.ruoli.edit', compact('ruolo', 'usersCount'));
    }

    public function update(Request $request, $id)
    {
        $ruolo = RolePreset::findOrFail($id);

        $validated = $request->validate([
            'description' => 'nullable|string|max:255',
            'permissions' => 'required|array',
            'permissions.*' => 'in:0,1,2',
        ]);

        $old = $ruolo->permissions;

        $ruolo->description = $validated['description'];
        $ruolo->permissions = $validated['permissions'];
        $ruolo->save();

        ActivityLog::log('update', 'ruoli', 'Modificato ruolo: ' . $ruolo->name, [
            'role_id' => $ruolo->id,
            'old_permissions' => $old,
            'new_permissions' => $validated['permissions'],
        ]);

        if ($request->input('update_users') === '1') {
            foreach ($ruolo->users as $user) {
                $user->permissions = $ruolo->permissions;
                $user->save();
            }
            return redirect('/admin/ruoli')->with('success', 'Ruolo aggiornato e permessi propagati a ' . $ruolo->users()->count() . ' utenti.');
        }

        return redirect('/admin/ruoli')->with('success', 'Ruolo aggiornato.');
    }

    public function destroy($id)
    {
        $ruolo = RolePreset::findOrFail($id);

        if ($ruolo->users()->count() > 0) {
            return redirect('/admin/ruoli')->with('error', 'Impossibile eliminare: ci sono ' . $ruolo->users()->count() . ' utenti con questo ruolo.');
        }

        $name = $ruolo->name;

        ActivityLog::log('delete', 'ruoli', 'Eliminato ruolo: ' . $name, [
            'role_id' => $id,
            'permissions' => $ruolo->permissions,
        ]);

        $ruolo->delete();

        return redirect('/admin/ruoli')->with('success', 'Ruolo eliminato.');
    }
}