<?php

namespace App\Http\Controllers\Backoffice;

use App\Facades\Backoffice\BackendUserService;
use App\Http\Controllers\Controller;
use App\Http\Requests\Backoffice\BackendUserDelete;
use App\Http\Requests\Backoffice\BackendUserStore;
use App\Http\Requests\Backoffice\ContentTypeListRequest;
use App\Models\Backoffice\Auth\BackendUser;
use App\Models\Backoffice\Auth\BackendUserType;
use App\Models\Backoffice\Auth\BackendPermissionGroup;
use App\Models\Backoffice\Traits\UserManageTrait;
use Illuminate\Support\Facades\Session;
use Inertia\Inertia;

class AdminUsersController extends Controller
{
    use UserManageTrait;

    public function getIndex()
    {
        $loggedUser = BackendUserService::getLoggedUser();

        return Inertia::render('Backoffice/AdminUsers/ListAdminUsers', [
            'data' => [
                'canInsert'     => $loggedUser->hasPermission('users.insert'),
                'user'          => $loggedUser,
            ]
        ]);
    }

    public function postList(ContentTypeListRequest $request)
    {
        $data = $request->validated();

        $sort = isset($data['sort']) ? array($data['sort']['key'] => $data['sort']['order']) : array("first_name" => "asc");

        $list = BackendUserService::getUserGridList($data['page'], $data['itemsPerPage'], $sort, $data['search']);

        return response()->json($list);
    }

    public function getEdit($userId = null)
    {
        $loggedUser = BackendUserService::getLoggedUser();

        if (!empty($userId) && $loggedUser->id != $userId
            && !$loggedUser->hasPermission("users.view")
            && !$loggedUser->hasPermission("users.insert")) {
            abort(403);
        }

        $canManage = $this->_canManage($userId);
        $canEdit   = $this->_canEdit($userId);
        $canView = $loggedUser->hasPermission("users.view");

        if (!empty($userId)) {
            $user = BackendUser::find($userId);
        } else {
            $user = new BackendUser();
        }

        if(empty($user)){
            abort(404);
        }

        $user->load(array("permissions" => function($query) {
            $query->select("id");
        }));

        $userTypes = BackendUserType::orderBy("name", "asc")->pluck("name", "id");

        $permissionGroups = BackendPermissionGroup::orderBy("position", "asc")
            ->with(array("permissions" => function($query) {
                $query->orderBy("position", "asc");
            }))->get();

        return Inertia::render('Backoffice/AdminUsers/EditAdminUser', [
            'data' => [
                'canManage' => $canManage,
                'canEdit' => $canEdit,
                'canView' => $canView,
                'user' => $user,
                'userTypes' => $userTypes,
                'permissionGroups' => $permissionGroups,
            ],
            'message' => Session::get('message'),
            'errorMessage' => Session::get('errorMessage')
        ]);
    }

    public function postEdit(BackendUserStore $request, $userId = null)
    {
        $data = $request->validated();
        $canManage = $this->_canManage();

        if(!empty($userId)){
            $user = BackendUserService::editUser($userId, $data, $canManage);
        }else{
            $user = BackendUserService::createUser($data);
        }

        $message = trans('backend.updated_successfully',
            array('entity' => trans('backend.user')));

        return redirect()->to('/admin/admin-users/edit/' . $user->id)->withMessage($message);
    }

    public function postDelete(BackendUserDelete $request)
    {
        $data = $request->validated();
        $user = BackendUser::find($data['userId']);

        if(!empty($user)){
            $user->delete();
        }

        return response()->json(["success" => true]);
    }
}
