/home/mip/mip/app/Modules/Client/Controllers/Directory/DirectoriesController.php
<?php

namespace QxCMS\Modules\Client\Controllers\Directory;

use DB;
use Auth;
use Datatables;
use Session;

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

use QxCMS\Modules\Client\Requests\Directory\DirectoryRequest;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;
use QxCMS\Modules\Client\Repositories\Directory\DirectoriesRepositoryInterface as Directory;
use QxCMS\Modules\Client\Repositories\Directory\AffiliatesRepositoryInterface as Affiliates;
use QxCMS\Modules\Client\Repositories\Directory\SpecializationsRepositoryInterface as Specializations;
use QxCMS\Modules\Client\Repositories\Directory\CitiesRepositoryInterface as Cities;
use QxCMS\Modules\Client\Repositories\Directory\ProvincesRepositoryInterface as Provinces;
use QxCMS\Modules\Client\Repositories\Directory\MunicipalitiesRepositoryInterface as Municipalities;


class DirectoriesController extends Controller
{
	protected $directory;
	protected $permission;
	protected $auth;
	protected $prefix_name = '';

	public function __construct(Permission $permission, Directory $directory, Affiliates $affiliates, Specializations $specializations, Cities $cities, Provinces $provinces, Municipalities $municipalities)
	{
		$this->directory = $directory;
        $this->affiliates = $affiliates;
        $this->specializations = $specializations;
        $this->cities = $cities;
        $this->provinces = $provinces;
        $this->municipalities = $municipalities;

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

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

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

    public function store(DirectoryRequest $request)
    {
        $this->authorize('create', $this->permissions());
        $subject = $this->directory->create($request->all()); 
        session()->flash('success', 'Successfully added.');

        return redirect($this->prefix_name.'/directory-store');
    }

    public function show($id)
    {
        //
    }

    public function edit($hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
        $data['permissions'] = $this->permissions();
        $data['directory'] = $this->directory->findById($id);
        $data['userLogs'] = $this->directory->getUserLogs($this->directory->getModuleId(), $id);

        return view('Client::directory-store.edit', $data, $this->getFormOptions());
    }

    public function update(DirectoryRequest $request, $hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
        
        $directory = $this->directory->update($id, $request->all());
        return redirect($this->prefix_name.'/directory-store');
    }

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

  
    public function getDirectoriesData(Request $request)
    {
        $directory = $this->directory->select([
            'id', 
            'category', 
            'name', 
            'affiliate_id', 
            'specialization_id', 
            'lat', 
            'lng', 
            'tel_no', 
            'email',
            DB::raw("CONCAT(locations.address_number,' ',locations.street,' ',locations.barangay) AS address")
        ])->with('affiliates', 'specializations');

        $permissions = $this->permissions();
        return Datatables::of($directory)
            ->filter(function ($query) use ($request) {
                if ($request->has('name')) {
                    $query->where('name', 'like', "%{$request->get('name')}%");
                }
                if ($request->has('category')) {
                    $query->where('category', 'like', "%{$request->get('category')}%");
                }
            })
            ->editColumn('affiliates-specializations.name', function($row) {
                if($row->affiliates == null) $html = "<p><b>Affiliate: </b>".'N/A'.'';
                else $html = "<p><b>Affiliates: </b>".$row->affiliates->name.'';

                if($row->specializations == null) $html.= "<br><b>Specialization: </b>".'N/A'.'';
                else $html.= "<br><b>Specialization: </b>".$row->specializations->name.'</p>';
                return $html;
            })
            ->addColumn('locations', function ($directory) {
                $html = "<p><b>Latitude: </b>".$directory->lat."";
                $html.= "<br/><b>Longitude: </b>".$directory->lng."</p>";
                return $html;
            })
            ->addColumn('contacts', function ($directory) {
                $html = "<p><b>Tel. No.: </b>".$directory->tel_no."";
                $html.= "<br/><b>Email: </b>".$directory->email."";
                $html.= "<br/><b>Address: </b>".$directory->address."</p>";
                return $html;
            })
            ->addColumn('action', function ($directory) use ($permissions){
                $html = '';
                if($this->auth->user()->can('update', $permissions)) {
                    $html .= '<a href="'.url('client').'/directory-store/edit/'.$directory->hashid.'"><button type="button" data-toggle="tooltip" title="Update" 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;<button type="button" data-toggle="tooltip" title="Delete" class="btn btn-danger btn-xs btn-flat deleted" data-action="'.url('client').'/directory-store/destroy/'.$directory->hashid.'"><span class="glyphicon glyphicon-trash"></span></button>';
                }
                return $html;
            })
            ->make(true);
    }

    protected function getFormOptions($directories = null)
    {
        $data['affiliates'] = $this->affiliates->affiliatesList();
        $data['specializations'] = $this->specializations->specializationsList();
        $data['cities'] = $this->cities->citiesList();
        $data['provinces'] = $this->provinces->provincesList();
        $data['municipalities'] = $this->municipalities->municipalitiesList();
        $data['categories'] = Array('directory' => 'Directory', 'store' => 'Store');
        return $data;
    }

}