/home/mip/mip/app/Modules/Client/Controllers/Principals/PrincipalController.php
<?php

namespace QxCMS\Modules\Client\Controllers\Principals;

use Illuminate\Http\Request;
use QxCMS\Http\Controllers\Controller;

use DB;
use Auth;
use Datatables;

use QxCMS\Modules\Client\Requests\Principals\PrincipalRequest;
use QxCMS\Modules\Client\Repositories\Principals\PrincipalRepositoryInterface as Principal;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class PrincipalController extends Controller
{
	protected $principal;
	protected $permission;
	protected $auth;
	protected $prefix_name = '';

	public function __construct(
        Principal $principal,
        Permission $permission
    )
	{
		$this->principal = $principal;
		$this->permission = $permission;
		$this->auth = Auth::guard('client');
		$this->prefix_name = config('modules.client');
	}

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

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

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

    public  function overview($hashid)
    {
        $this->authorize('activated', $this->permissions());
        $data['permissions'] = $this->permissions();  
        $id = decode($hashid);
        $data['principal'] = $this->principal->with(['contacts'])->find($id);

        return view('Client::principals.overview', $data);
    }

    public function create()
    {   
        $this->authorize('create', $this->permissions());
        $data['statuses'] = $this->principal->getPrincipalStatusLists();

        return view('Client::principals.create', $data);
    }

    public function store(PrincipalRequest $request)
    {
        $this->authorize('create', $this->permissions());
        $input = $request->all();
        $input['client_id'] = $this->auth->user()->client->id;
        $principal = $this->principal->create($input);
        if(!$request->ajax()) {         
            session()->flash('success', 'Successfully added.');
            return redirect($this->prefix_name.'/principals/'.$principal->hashid.'/edit');
        }

        return response(
                array('message'=>'Successfully added.','type'=>'success', 'row' => $principal)
            )->header('Content-Type', 'application/json');
    }

    public function edit($hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
        $data['permissions'] = $this->permissions();
        $data['statuses'] = $this->principal->getPrincipalStatusLists();
        $data['principal'] = $this->principal->findById($id);
        $data['userLogs'] = $this->principal->getUserLogs($this->principal->getModuleId(), $id);
        return view('Client::principals.edit', $data);
    }

    public function update(PrincipalRequest $request, $hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
      
        $input = $request->all();
        $input['client_id'] = $this->auth->user()->client->id;
        $principal = $this->principal->update($id, $input);

        return redirect($this->prefix_name.'/principals/'.$principal->hashid.'/edit');
    }

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

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

    public function login(Request $request, $hashid)
    {
        $id = decode($hashid);
        $client = $this->auth->user()->client;
        $root_dir = $client->root_dir;
        session(['root_dir'=>$root_dir]);        
        if (Auth::guard('employer')->loginUsingId($id)) {
            $user = Auth::guard('employer')->user();
            if($user->status == 'Active')
            {
                return redirect('/employer/'.$root_dir.'/dashboard');
            } else {
                Auth::guard('employer')->logout();
                $request->session()->regenerate();
                session()->flash('error_logout', 'This principal is inactive.');
                return redirect(config('modules.employer').'/'.$root_dir.'/auth/login');
            }
        } else {
            return "not login";
        }
    }

    /*
    * Datatables
    */
    public function getPrincipalsData()
    {           
        $principals = $this->principal->select([
            'principals.id',
            'principals.name',
            'principals.email',
            'principals.status',
            'principals.address',
            'principals.contact_details'
        ]);

        $permissions = $this->permissions();
        return Datatables::of($principals)
            ->editColumn('status', function($principal) {
                if($principal->status == 'Active') return '<span class="label label-success">Active</span>';
                else return '<span class="label label-danger">Inactive</span>';
            })
            ->addColumn('details', function($model) {
                $html_out = '';
                if($model->name != "") {
                    $html_out .= '<a href="'.url($this->prefix_name.'/principals/'.$model->hashid.'/overview').'"><font size="4">'.$model->name.'</font></a>';
                }

                if($model->address != '')
                {
                    $html_out .= "<br /><i class=\"fa fa-map-marker\"></i> ".$model->address;
                }

                if($model->email != '')
                {
                    $html_out .= "<br /><i class=\"fa fa-envelope\"></i> ".$model->email;
                }

                if($model->contact_details != '')
                {
                    if(is_array($model->contact_details)) {

                        $html_out .= "<br /><i class=\"fa fa-phone\"></i> ".implode(', ', $model->contact_details);

                    }
                }
                return $html_out;
            })
            ->filterColumn('details', function($query, $keyword) {
                   $query->whereRaw("name like ?", ["%{$keyword}%"]);
            })
            ->addColumn('action', function ($principal) use ($permissions){
                $html_out = '';
                if($this->auth->user()->can('update', $permissions)) {
                    $html_out .= '<a href="'.url($this->prefix_name.'/principals/'.$principal->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-'.$principal->hashid.'" class="btn btn-xs btn-flat btn-danger" id="btn-delete" data-action="'.url($this->prefix_name).'/principals/'.$principal->hashid.'" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fa fa-trash-o"></i></a>';
                }

               /* if($this->auth->user()->role_id == 1) {
                    $html_out .= '&nbsp;&nbsp;<a href="'.url($this->prefix_name.'/principals/'.$principal->hashid.'/login').'" class="btn btn-xs btn-flat btn-success" data-toggle="tooltip" data-placement="top" title="Login" target="_blank"><i class="fa fa-sign-in"></i></a>';
                }*/
                return $html_out;
            })
            ->orderColumn('details', 'name $1')
			->make(true);
    }
}