<?php

namespace App\Libs\Services;

use App\Models\BackendAuth\BackendUser;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Str;
use RequestContext;
use Auth;
use DB;

class BackendUserService
{

    /**
     * Gets the admin logged user
     *
     * @return App\Models\BackendAuth\BackendUser
     */
    public function getLoggedUser()
    {
        $requestContext = RequestContext::instance();

        if (!isset($requestContext->loggedBackendUser)) {
            $user = Auth::guard('admin')->user();

            if (!empty($user)) {
                $user->load("permissions");
            }
            $requestContext->loggedBackendUser = $user;
        }

        return $requestContext->loggedBackendUser;
    }

    /**
     * Get the backend user list for the backoffice grid
     *
     * @param $page
     * @param $rowCount
     * @param $sort
     * @param $search
     *
     * @return array
     */
    public function getUserGridList($page, $rowCount, $sort, $search)
    {
        Paginator::currentPageResolver( function () use ($page) {
            return $page;
        });

        if (!empty($search)) {
            $query = BackendUser::where(function ($query) use ($search) {
                $query->orWhere('first_name', 'like', "%{$search}%")
                    ->orWhere('last_name', 'like', "%{$search}%")
                    ->orWhere('email', 'like', "%{$search}%")
                    ->orWhere('role', 'like', "%{$search}%");
            });
        } else {
            $query = BackendUser::query();
        }
        if (empty($sort)) {
            $rows = $query->paginate($rowCount);
        } else {
            foreach ($sort as $field => $direction) {
                if(empty($direction) || !Str::is(strtolower($direction),"desc")){
                    $orderDirection = "asc";
                } else {
                    $orderDirection = $direction;
                }
                $rows = $query->orderBy($field, strtolower($orderDirection))->paginate($rowCount);
                break;
            }
        }

        return [
            "total"             => $rows->total(),
            "current"           => $rows->currentPage(),
            "rowCount"          => $rowCount,
            "rows"              => $rows->getCollection()
        ];
    }

    public function createUser($data)
    {
        $user = new BackendUser();
        return $this->_fillUserData($user, $data, true);
    }

    public function editUser($userId, $data, $canManage)
    {
        $user = BackendUser::findOrFail($userId);
        return $this->_fillUserData($user, $data, $canManage);
    }

    protected function _fillUserData(BackendUser $user, $data, $canManage)
    {
        $user->username = $data["username"];

        if($canManage){
            $user->first_name = $data["first_name"];
            $user->last_name = $data["last_name"];
            $user->name = $data["first_name"] . " " . $data["last_name"];
            $user->email = $data['email'];
            $user->location = $data['location'];
            $user->contact_1 = $data["contact_1"];
            $user->contact_2 = $data["contact_2"];
            $user->role = $data["role"];
            $user->type_id = $data['type_id'];
        }

        if(isset($data["password"])){
            $user->password = $data["password"];
        }

        DB::transaction(function () use ($user, $data, $canManage) {
            $user->save();
            if($canManage){
                $user->permissions()->sync($data["user_permissions"]);
            }
        });

        return $user;
    }
}