/home/mip/mip/app/Modules/Client/Controllers/Questionnaire/QuestionController.php
<?php

namespace QxCMS\Modules\Client\Controllers\Questionnaire;

use DB;
use Auth;
use Datatables;

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

use QxCMS\Modules\Client\Requests\Questionnaire\QuestionRequest;
use QxCMS\Modules\Client\Repositories\Questionnaire\TemplateRepositoryInterface as Template;
use QxCMS\Modules\Client\Repositories\Questionnaire\QuestionRepositoryInterface as Question;
use QxCMS\Modules\Client\Repositories\Questionnaire\AnswerRepositoryInterface as Answer;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class QuestionController extends Controller
{
    protected $template;
	protected $question;
    protected $answer;
	protected $permission;
	protected $auth;
	protected $prefix_name = '';

	public function __construct(
        Template $template, 
        Question $question,
        Answer $answer,
        Permission $permission
    )
	{
        $this->template = $template;
		$this->question = $question;
        $this->answer = $answer;
		$this->permission = $permission;
		$this->auth = Auth::guard('client');
		$this->prefix_name = config('modules.client');
        config(['jsvalidation.view' => 'jsvalidation::bootstrap-modal']);
	}

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

    public function index($template_hashid) 
    {
    	$this->authorize('activated', $this->permissions());
    	
        $data['permissions'] = $this->permissions();
        $template_id = decode($template_hashid);
        $data['template'] = $this->template->findById($template_id);
        $data['userLogs'] = $this->question->getUserLogs($this->template->getModuleId(), '', 'Questions-'.$template_id);
        return view('Client::questionnaire.question.index', $data);    	
    }

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

        $template_id = decode($template_hashid);
        $data['template'] = $this->template->findById($template_id);
        $data['question_types'] = $this->question->getQuestionTypes();

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

    public function store(Request $request, $template_hashid)
    {
        $this->authorize('create', $this->permissions());
        $template_id = decode($template_hashid);

        $question_input = $request->except(['name']);
        $question_input['template_id'] = $template_id;

        $question = $this->question->create($question_input);

        $choices = array_filter($request->get('name'), 'strlen');
        if(!empty($choices)) {
            $order = 1;
            foreach ($choices as $choice_key => $choice) {
                $input['name'] = $choice;
                $input['question_id'] = $question->id;
                $input['order'] = $order;
                $this->answer->create($input);
                $order = $order + 1;
            }
        }

        if($request->get('_save') == 'add_another') {
            session()->flash('success', 'Question is successfully added. Please add another question.');
            return redirect($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question/create');
        }

        session()->flash('success', 'Question is successfully added.');
        return redirect($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question');
    }

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

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

        $data['permissions'] = $this->permissions();
        $data['question_types'] = $this->question->getQuestionTypes();

        $data['template'] = $this->template->findById($template_id);
        $data['userLogs'] = $this->question->getUserLogs($this->question->getModuleId(), $id,'Questions-'.$template_id);
        $data['question'] = $this->question->with(['answers' => function($query){
            $query->orderBy('order', 'ASC');
        }])->find($id);
    
        return view('Client::questionnaire.question.edit', $data);
    }

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

        $question = $this->question->update($id, $request->except(['name']));
        $choices = array_filter($request->get('name'), 'strlen');

        $this->answer->where('question_id', $id)->whereNotIn('id', array_keys($choices))->delete();
        if(!empty($choices)) {
            $order = 1;
            foreach ($choices as $choice_key => $choice) {
              //  return $choice_key;
                $input['name'] = $choice;
                $input['question_id'] = $question->id;
                $input['order'] = $order;

                if(starts_with($choice_key, 'new')) {
                    $this->answer->create($input);
                } else {
                    $this->answer->update($choice_key, $input);
                }

                $order = $order + 1;
            }
        }

        return redirect($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question');
    }

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


    public function copyQuestion($hashid)
    {
        $this->authorize('update', $this->permissions());
        $id = decode($hashid);
       
        $question = $this->question->with(['answers'])->find($id);
        return $this->question->copyQuestion($question);
    }

    public function sortQuestion(Request $request)
    {
        $orders = $request->get('question-table');
        foreach ($orders as $order => $id) {
            //if ($key <> 0) {
                $this->question->sort(($order + 1), $id);
           // } 
        }
        return $orders;
    }

    /*
    * Datatables
    */
    public function getQuestionData($template_hashid)
    {        

        $template_id = decode($template_hashid);
        $questions = $this->question->where('template_id', '=', $template_id)->orderBy('order', 'ASC');
        $permissions = $this->permissions();


        return Datatables::of($questions)
            
                
                ->addColumn('action', function ($question) use ($permissions) {
                    $html_out = '';
    	            
                    if($this->auth->user()->can('update', $permissions)) {
                        $html_out .= '<a href="'.url($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question/'.$question->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>';
                        $html_out .= '&nbsp;&nbsp;<a href="'.url($this->prefix_name.'/questionnaire/'.$question->hashid.'/question/copy').'" id="copy-question" class="btn btn-xs btn-flat btn-info" data-toggle="tooltip" data-placement="top" title="Duplicate"><i class="fa fa-copy"></i></a>';
                    }

                    if($this->auth->user()->can('delete', $permissions)) {
                        $html_out .= '&nbsp;&nbsp;<a href="#delete-'.$question->hashid.'" class="btn btn-xs btn-flat btn-danger" id="btn-delete" data-action="'.url($this->prefix_name).'/questionnaire/'.hashid($question->template_id).'/question/'.$question->hashid.'" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fa fa-trash-o"></i></a>';
                    }
    	            
    	            return $html_out;
    	        })
                ->setRowId('id')

	            ->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();
    }*/
}