<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\BackendUserDelete;
use App\Http\Requests\BackendUserStore;
use App\Libs\Transformers\BackendAuth\BackendUserTransformer;
use App\Models\BackendAuth\BackendPermissionGroup;
use App\Models\BackendAuth\BackendUser;
use App\Models\BackendAuth\BackendUserType;
use BackendUserService;
use Illuminate\Http\Request;
use Fractal;
use RequestContext;

class UserController extends Controller
{

    use UserManageTrait;

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

        return view('admin.pages.backend_users.admin_users', [
            'canInsert'     => $loggedUser->hasPermission('users.insert'),
            'loggedUser'    => $loggedUser
        ]);
    }

    public function postList(Request $request)
    {
        $page = $request->input("current");
        $rowCount = $request->input("rowCount");
        $sort = $request->input("sort");
        $search = $request->input("searchPhrase");

        if (!empty($page)) {
            $result = BackendUserService::getUserGridList($page, $rowCount, $sort, $search);
            $result["rows"] = Fractal::collection($result["rows"])
                ->transformWith(new BackendUserTransformer())->toArray();
            return response()->json($result);
        } else {
            $users = BackendUser::all();
            return response()->json(Fractal::collection($users)
                ->transformWith(new BackendUserTransformer())->toArray());
        }
    }

    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);

        RequestContext::set('selected_menu', 'admin');
        RequestContext::set('selected_menu_option', 'list_users');

        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");
        $permissions = BackendPermissionGroup::orderBy("position", "asc")
            ->with(array("permissions" => function($query){
                $query->orderBy("position", "asc");
            }))->get();

        return view('admin.pages.backend_users.user_form', [
            'user'          => $user,
            'userTypes'     => $userTypes,
            'permissions'   => $permissions,
            'canManage'     => $canManage,
            'canEdit'       => $canEdit,
            'canView'       => $loggedUser->hasPermission("users.view")
        ]);
    }

    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('/admin/admin-users/edit/' . $user->id)
            ->with("message", $message);
    }

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

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

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


}
