<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests\RoleValidation;
use App\Models\Role;
use App\Models\User;

class RolesController extends Controller
{
    public function index()
    {
        if (!auth()->user()->can('viewAny', Role::class)) {
            return redirect('/')->with('error', 'You do not have access to view Roles');
        }

        if (request()->expectsJson()) {
            $roles = Role::with('users')->get();
            $roles->each(function ($role) {
                $role->users->each->append('last_name');
            });
            return response()->json([
                'roles' => $roles,
            ]);
        }

        return view('roles.index');
    }

    public function store(RoleValidation $request, $id = null)
    {
        if ($id) {
            $role = Role::findOrFail($id);
            if (!auth()->user()->can('update', $role)) {
                return response()->json(['error' => 'You do not have permission to update that Role'], 403);
            }
        } else {
            if (!auth()->user()->can('create', Role::class)) {
                return response()->json(['error' => 'You do not have permission to create Roles'], 403);
            }
        }

        $role = (new Role())->saveRole(requestInput(), $id);

        return response()->json([
            'success' => $role->name.' Saved',
            'role' => $role->refresh()->load('users'),
        ]);
    }

    public function search()
    {
        if (!auth()->user()->can('viewAny', Role::class)) {
            return response()->json([ 'error' => 'You do not have permission to search for roles' ], 403);
        }

        return (new Role())->search();
    }

    public function remove($id)
    {
        $role = Role::findOrFail($id);

        if (!auth()->user()->can('delete', $role)) {
            return response()->json([ 'error' => 'You do not have permission to remove roles' ], 403);
        }

        $role->removeRole();

        return response()->json([
            'success' => $role->name.' & Permissions Removed',
        ]);
    }

    /*
    public function removeUser($id)
    {
        $role = Role::findOrFail($id);
        if (auth()->user()->can('update', $role)) {
            $user = User::findOrFail(requestInput('user_id'));
            $user->removeRole($role);

            cache()->tags([cache_name($user)])->flush();

            return response()->json([
                'success' => $user->name.' Removed From '.$role->name,
            ]);
        } else {
            return redirect()->route('home')->with(['error' => 'You do not have permission to update roles']);
        }
    }
     */
}
