<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RoleController extends Controller
{
    public function index(Request $request)
    {
        $search = $request->input('search');
        $perPage = $request->input('per_page', 10);

        $roles = Role::with('permissions')
            ->when($search, function ($query, $search) {
                return $query->where('name', 'like', "%{$search}%");
            })
            ->withCount('users')
            ->orderBy('name')
            ->paginate($perPage);

        return Inertia::render('admin/roles/Index', [
            'roles'   => $roles,
            'filters' => [
                'search'   => $search,
                'per_page' => $perPage,
            ],
        ]);
    }

    public function create()
    {
        $permissions = Permission::all();

        return Inertia::render('admin/roles/Create', [
            'permissions' => $permissions,
        ]);
    }

    public function store(Request $request)
    {

        $validated = $request->validate([
            'name'        => 'required|string|max:255|unique:roles,name',
            'permissions' => 'array',
        ]);

        // Custom validation for permissions
        if (isset($validated['permissions']) && ! empty($validated['permissions'])) {
            $existingPermissions = Permission::whereIn('name', $validated['permissions'])->pluck('name')->toArray();
            $invalidPermissions = array_diff($validated['permissions'], $existingPermissions);

            if (! empty($invalidPermissions)) {
                return back()->withErrors([
                    'permissions' => 'Some permissions are invalid: ' . implode(', ', $invalidPermissions),
                ]);
            }
        }

        $role = Role::create(['name' => $validated['name']]);

        if (isset($validated['permissions'])) {
            $role->givePermissionTo($validated['permissions']);
        }

        return redirect()->route('admin.roles.index');
    }

    public function show(Role $role)
    {
        $role->load('permissions', 'users');

        return Inertia::render('admin/roles/Show', [
            'role' => $role,
        ]);
    }

    public function edit(Role $role)
    {
        $role->load('permissions');
        $permissions = Permission::all();

        return Inertia::render('admin/roles/Edit', [
            'role'        => $role,
            'permissions' => $permissions,
        ]);
    }

    public function update(Request $request, Role $role)
    {

        $validated = $request->validate([
            'name'        => 'required|string|max:255|unique:roles,name,' . $role->id,
            'permissions' => 'array',
        ]);

        // Custom validation for permissions
        if (isset($validated['permissions']) && ! empty($validated['permissions'])) {
            $existingPermissions = Permission::whereIn('name', $validated['permissions'])->pluck('name')->toArray();
            $invalidPermissions = array_diff($validated['permissions'], $existingPermissions);

            if (! empty($invalidPermissions)) {
                return back()->withErrors([
                    'permissions' => 'Some permissions are invalid: ' . implode(', ', $invalidPermissions),
                ]);
            }
        }

        $role->update(['name' => $validated['name']]);

        // Sync permissions
        if (isset($validated['permissions'])) {
            $role->syncPermissions($validated['permissions']);
        } else {
            $role->syncPermissions([]);
        }

        return redirect()->route('admin.roles.index');
    }

    public function destroy(Role $role)
    {
        // Prevent deleting roles that have users assigned
        if ($role->users()->count() > 0) {
            return back()->withErrors(['error' => 'Cannot delete role that has users assigned.']);
        }

        $role->delete();

        return redirect()->route('admin.roles.index');
    }
}
