/home/mip/mip/app/Modules/Client/Controllers/Principals/ContactPersonController.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\ContactPersonRequest;
use QxCMS\Modules\Client\Repositories\Principals\ContactPersonRepositoryInterface as ContactPerson;
use QxCMS\Modules\Client\Repositories\Principals\ContactNumberRepositoryInterface as ContactNumber;
use QxCMS\Modules\Client\Repositories\Principals\PrincipalRepositoryInterface as Principal;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class ContactPersonController extends Controller
{
	protected $principal;
    protected $person;
    protected $number;
	protected $permission;
	protected $auth;
	protected $prefix_name = '';

	public function __construct(
        Principal $principal,
        ContactNumber $number,
        ContactPerson $person,
        Permission $permission
    )
	{
		$this->principal = $principal;
        $this->person = $person;
        $this->number = $number;
		$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($principal_hashid)
    {
    	$this->authorize('activated', $this->permissions());
        $principal_id  = decode($principal_hashid);

    	$data['permissions'] = $this->permissions();       
        $data['principal'] = $this->principal->findById($principal_id);
        $data['userLogs'] = $this->person->getUserLogs($this->person->getModuleId(), '', 'Contacts-'.$principal_id);
        return view('Client::principals.contact-persons.index', $data);
    }

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

    public function create($principal_hashid)
    {   
        $this->authorize('create', $this->permissions());

        $principal_id  = decode($principal_hashid);
        $data['principal'] = $this->principal->findById($principal_id);
        return view('Client::principals.contact-persons.create', $data);
    }

    public function store(ContactPersonRequest $request, $principal_hashid)
    {
        $this->authorize('create', $this->permissions());
        $principal_id  = decode($principal_hashid);
        $input = $request->except(['contact']);
        $input['principal_id'] = $principal_id;
        $person = $this->person->create($input);

        $contacts = array_filter($request->get('contact'), 'strlen');
        if(!empty($contacts)) {
            foreach ($contacts as $contact_key => $contact) {
               $input_number['contact'] = $contact;
               $input_number['principal_contact_id'] = $person->id;
               $this->number->create($input_number);
            }
        }
        if(!$request->ajax()) {         
            session()->flash('success', 'Successfully added.');
            return redirect($this->prefix_name.'/principals/'.hashid($principal_id).'/contact-persons');
        }

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

    public function edit($principal_hashid, $hashid)
    {
        $this->authorize('update', $this->permissions());
        $principal_id = decode($principal_hashid);
        $id = decode($hashid);

        $data['principal'] = $this->principal->findById($principal_id);
        $data['contact'] = $this->person->with(['numbers'])->find($id);
        $data['userLogs'] = $this->person->getUserLogs($this->person->getModuleId(), $id, 'Contacts-'.$principal_id);

        return view('Client::principals.contact-persons.edit', $data);
    }

    public function update(ContactPersonRequest $request, $principal_hashid, $hashid)
    {
        $this->authorize('update', $this->permissions());

        $principal_id = decode($principal_hashid);
        $id = decode($hashid);

        $input = $request->except(['contact']);
        $input['principal_id'] = $principal_id;

        $person = $this->person->update($id, $input);


        $contacts = array_filter($request->get('contact'), 'strlen');

       $check = $this->number->where('principal_contact_id', $id)->whereNotIn('id', array_keys($contacts));
        if(count($check->get()) > 0) {
            $check->delete();
            session()->flash('success', 'Successfully updated.');
        }
        if(!empty($contacts)) {
            foreach ($contacts as $contact_key => $contact) {
                $input_number['contact'] = $contact;
                $input_number['principal_contact_id'] = $person->id;

                if(starts_with($contact_key, 'new')) {
                    $this->number->create($input_number);
                    session()->flash('success', 'Successfully updated.');
                } else {
                    $this->number->update($contact_key, $input_number);
                }
            }
        }

        return redirect($this->prefix_name.'/principals/'.hashid($principal_id).'/contact-persons/'.$person->hashid.'/edit');
    }

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

    /*
    * Datatables
    */
    public function getContactPersonsData($principal_hashid)
    {   
        $principal_id = decode($principal_hashid);        
        $contacts = $this->person->select([
            'id',
            'principal_id',
            'name',
            'position',
            'email'
        ])->with(['numbers'])->where(function($query) use ($principal_id){
            if($principal_id) $query->where('principal_id', $principal_id);
        });

        $permissions = $this->permissions();

        return Datatables::of($contacts)
            
            ->addColumn('contact_details', function($model){
                $html_out = "";
                if($model->name != '')
                {
                    $html_out .= '<b>Name:</b>&nbsp;<a href="'.url($this->prefix_name.'/principals/'.hashid($model->principal_id).'/contact-persons/'.$model->hashid.'/edit').'"><font size="4">'.$model->name.'</font></a>';
                    $html_out .= "<br /><b>Position:</b>&nbsp;".$model->position; 
                    $html_out .= "<br /><b>Email:</b>&nbsp;".$model->email; 
                }
                return $html_out;
            })
            ->addColumn('contact_numbers', function($model){
                $html_out = "";
                if(count($model->numbers) > 0) {
                    foreach ($model->numbers as $number_key => $number) {
                        $html_out .= "<i class=\"fa fa-mobile\"></i> ".$number->contact."<br />";
                    }
                }

                return $html_out;
            })
            ->editColumn('name', function($model){
                $html_out = '';
                if($model->name != '')
                {
                    $html_out .= '<a href="'.url($this->prefix_name.'/principals/'.hashid($model->principal_id).'/contact-persons/'.$model->hashid.'/edit').'">'.$model->name.'</a>';
                }
                return $html_out;
            })
            ->addColumn('action', function ($model) use ($permissions){
                $html_out = '';
                if($this->auth->user()->can('update', $permissions)) {
                    $html_out .= '<a href="'.url($this->prefix_name.'/principals/'.hashid($model->principal_id).'/contact-persons/'.$model->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-'.$model->hashid.'" class="btn btn-xs btn-flat btn-danger" id="btn-delete" data-action="'.url($this->prefix_name).'/principals/'.hashid($model->principal_id).'/contact-persons/'.$model->hashid.'" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fa fa-trash-o"></i></a>';
                }                               
              
                return $html_out;
            })
            ->orderColumn('contact_details', 'name $1')
			->make(true);
    }
}