/home/mip/mip/app/Modules/Client/Controllers/Settings/UserController.php
<?php

namespace QxCMS\Modules\Client\Controllers\Settings;

use Illuminate\Http\Request;


use QxCMS\Http\Controllers\Controller;
use QxCMS\Modules\Client\Repositories\Settings\Users\UserRepositoryInterface as User;
use QxCMS\Modules\Client\Repositories\Settings\Roles\RoleRepositoryInterface as Role;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;
use QxCMS\Modules\Client\Requests\Settings\UserRequest;
use Datatables;
use Auth;
use DB;

class UserController extends Controller
{
    protected $user;
	protected $role;
	protected $permission;
	protected $auth;
	protected $prefix_name = '';

	public function __construct(User $user, Role $role, Permission $permission)
	{
		$this->user = $user;
        $this->role = $role;
		$this->permission = $permission;
		$this->auth = Auth::guard('client');
		$this->prefix_name = config('modules.client');
        $this->getDetails($this->user->getModuleId());
	}

	public function permissions()
    {
        return $this->permission->getPermission($this->user->getModuleId());
    }

    public function index()
    {
    	$this->authorize('activated', $this->permissions());
    	$data['permissions'] = $this->permissions();
        $data['userLogs'] = $this->user->getUserLogs($this->user->getModuleId());
        return view('Client::settings.users.index', $data);    	
    }

    public function create()
    {
        $this->authorize('create', $this->permissions());        
        $data['permissions'] = $this->permissions();
        $data['roles'] = $this->role->getLists();
        return view('Client::settings.users.create', $data);
    }

    public function store(UserRequest $request)
    {
        $this->authorize('create', $this->permissions());
        $user = $this->user->create($request->all()); 
        session()->flash('success', 'Successfully added.');
        return redirect($this->prefix_name.'/settings/users');
    }

    public function show($id)
    {
        $this->authorize('activated', $this->permissions());
    }

    public function edit($hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
        $data['permissions'] = $this->permissions();
        $data['roles'] = $this->role->getLists();
        $data['user'] = $this->user->findById($id);
        $data['userLogs'] = $this->user->getUserLogs($this->user->getModuleId(), $id);
        return view('Client::settings.users.edit', $data);
    }

    public function update(UserRequest $request, $hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
        $this->user->update($id, $request->all());
        return redirect($this->prefix_name.'/settings/users');
    }

    public function destroy($hashid)
    {
        $this->authorize('delete', $this->permissions());
        $id = decode($hashid);
        return $this->user->delete($id); 
    }


    public function select2(Request $request)
    {   
        return $this->user->select2($request->all());
    }


    /*
    * Datatables
    */
    public function getUsersData(Request $request)
    {        
        $params = [
            'hiddenRoleIds' => $this->role->getHiddenRoleIds(),
            'developer_id' => $this->role->getDeveloperId()
        ];

        $users = $this->user->datatablesIndex($params);
        return Datatables::of($users)
        	->editColumn('status',function($client){
                if($client->status == 0) return '<span class="label label-danger">Deactivated</span>';
                return '<span class="label label-success">Activated</span>';
            })
	        ->addColumn('action', function ($user) {
	            $html_out = '';
	            $permissions = $this->permissions();
	            if($user->id != 1) {
	                if($this->auth->user()->can('update', $permissions)) {
	                    $html_out .= '<a href="'.url($this->prefix_name.'/settings/users/'.$user->hashid.'/edit').'" class="btn btn-xs btn-flat btn-warning" data-toggle="tooltip" data-placement="top" title="Edit"><i class="fa fa-pencil"></i></a>';
	                }
	                if($this->auth->user()->can('delete', $permissions)) {
	                    $html_out .= '&nbsp;&nbsp;<a href="#delete-'.$user->hashid.'" class="btn btn-xs btn-flat btn-danger" id="btn-delete" data-action="'.url($this->prefix_name).'/settings/users/'.$user->hashid.'" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fa fa-trash-o"></i></a>';
	                }
	            } else {
	                if($this->auth->user()->can('update', $permissions)) {
	                    $html_out = '<a href="'.url($this->prefix_name.'/settings/users/'.$user->hashid.'/edit').'" class="btn btn-xs btn-flat btn-warning" data-toggle="tooltip" data-placement="top" title="Edit"><i class="fa fa-pencil"></i></a>';
	                }
	            }
	            return $html_out;
	        })
            ->rawColumns(['action', 'status'])
	        ->make(true);
    }

    public function getTokenInputUserLists(Request $request)
    {
        if($request->has('q')) {
            if($request->input('q') <> '') {
                return $this->user->tokenInputLists()->where('name', 'LIKE', '%'.$request->input('q').'%')->where('client_id', $this->auth->user()->client->id)->get();
            }
        }
        return $this->user->tokenInputLists()->where('client_id', $this->auth->user()->client->id)->get();
    }
}