/home/mip/mip/app/Modules/Client/Controllers/JobOpening/JobOpeningController.php
<?php

namespace QxCMS\Modules\Client\Controllers\JobOpening;

use Auth;
use Session;
use Datatables;
use Carbon\Carbon;

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

use QxCMS\Modules\Client\Models\Settings\Country;
use QxCMS\Modules\Client\Requests\JobOpening\JobOpeningRequest;
use QxCMS\Modules\Client\Repositories\JobOpening\JobOpeningRepositoryInterface as JobOpening;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class JobOpeningController extends Controller
{
	protected $job_opening;
	protected $permission;
	protected $auth;
    protected $country;
	protected $prefix_name = '';

	public function __construct(Permission $permission, JobOpening $job_opening, Country $country)
	{
        $this->country = $country;
		$this->job_opening = $job_opening;

		$this->permission = $permission;
		$this->auth = Auth::guard('client');
		$this->prefix_name = config('modules.client');
        $this->getDetails($this->job_opening->getModuleId());
	}

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

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

    public function create()
    {
        $this->authorize('create', $this->permissions());
        $data['permissions'] = $this->permissions();
        return view('Client::job-opening.create', $data, $this->getFormOptions());
    }

    public function store(JobOpeningRequest $request)
    {
        $this->authorize('create', $this->permissions());
        $job_opening = $this->job_opening->create($request); 

        if($request->get('_save') == 'add_another') {
            session()->flash('success', 'Successfully added. Please add another.');
            return redirect($this->prefix_name.'/job-opening/create');
        }

        session()->flash('success', 'Successfully added.');
        return redirect($this->prefix_name.'/job-opening');
    }

    public function show($id)
    {
        //
    }

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

    public function update(JobOpeningRequest $request, $hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);

        $pages = $this->job_opening->update($id, $request);
        return redirect($this->prefix_name.'/job-opening');
    }

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

    public function details(Request $request, $hashid)
    {
        $id = decode($hashid);
        $job = $this->job_opening->where('id', $id)->with('country')->first();
        if($request->ajax()) {
            return $job;
        }
    }
  
    public function getJobData(Request $request)
    {
        $job = $this->job_opening->select(['job_opening.*']);
        $permissions = $this->permissions();

        return Datatables::of($job)
            ->filter(function ($query) use ($request) {
                if ($request->has('position')) {
                    $query->where('position', 'like', "%{$request->get('position')}%");
                }
                if ($request->has('status')) {
                    $query->where('status', '=', "{$request->get('status')}");
                }
            })
            ->editColumn('position', function($job){
                return '<span data-toggle="tooltip" data-placement="top" title="View Details"><a href="#job-details-modal" data-toggle="modal" data-details_url="'.route($this->prefix_name.'.job-opening.details', $job->hashid).'">'.$job->position.'</a></span>';
            })
            ->editColumn('opening_date', function($job){
                return Carbon::parse($job->opening_date)->format('M j, Y');
            })
            ->editColumn('closing_date', function($job){
                return Carbon::parse($job->closing_date)->format('M j, Y');
            })
            ->addColumn('action', function($job) use ($permissions){
                $html = '';
                if($this->auth->user()->can('update', $permissions)) {
                    $html .= '<a href="'.route($this->prefix_name.'.job-opening.edit', $job->hashid).'"><button type="button" data-toggle="tooltip" title="Edit" class="btn btn-warning btn-xs btn-flat edited"><span class="glyphicon glyphicon-pencil"></span></button></a>';
                }
                if($this->auth->user()->can('delete', $permissions)) {
                    $html .= '&nbsp;&nbsp;<a href="#delete-'.$job->hashid.'" class="btn btn-xs btn-flat btn-danger" id="btn-delete" data-action="'.route($this->prefix_name.'.job-opening.destroy', $job->hashid).'" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fa fa-trash-o"></i></a>';
                }
                return $html;
            })
            ->make(true);
    }

    protected function getFormOptions()
    {
        $data['status'] = Array('Open' => 'Open', 'Close' => 'Close', 'Draft' => 'Draft');
        $data['country'] = $this->country->pluck('name', 'id');
        return $data;
    }

}