/home/mip/mip/app/Modules/Client/Repositories/Questionnaire/QuestionRepository.php
<?php

namespace QxCMS\Modules\Client\Repositories\Questionnaire;

use QxCMS\Modules\AbstractRepository;

use QxCMS\Modules\Client\Models\Questionnaire\Question;
use QxCMS\Modules\Client\Models\Settings\UserLogs\UserLogs as Log;

class QuestionRepository extends AbstractRepository implements QuestionRepositoryInterface
{
    protected $model;
    protected $log;

    function __construct(Question $model, Log $log)
    {
        $this->model = $model;
        $this->log = $log;
    }
    
    public function create(array $request)
    {
        $user = auth()->user();
        $model = $this->model->fill($this->_serialize($request));
        $model->save();
        $this->log->saveLog(['action' => 'Create', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id, 'sub_menu' => 'Questions-'.$model->template_id]);
        return $model;
    }

    public function _serialize(array $request)
    {
        if(isset($request['template_id'])) {
            $order = $this->model->where('template_id', $request['template_id'])->count();
            $request['order'] = $order + 1;
        }
        if(!isset($request['required'])) $request['required'] = false;
        if(!isset($request['multiple_select'])) $request['multiple_select'] = false;

        return $request;
    }

    public function update($id, array $request)
    {
        $user = auth()->user();
        $model = $this->findById($id);
        $model->fill($this->_serialize($request));
        if(count($model->getDirty()) > 0) {
            $model->save();
            session()->flash('success', 'Question is successfully updated.');
            $this->log->saveLog(['action' => 'Update', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id, 'sub_menu' => 'Questions-'.$model->template_id]);
        }

        return $model;
    }

    public function delete($id)
    {
        $user = auth()->user();
        $model = $this->findById($id);
        $model->answers()->delete();
        $model->delete();
        $this->log->saveLog(['action' => 'Delete', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id, 'sub_menu' => 'Questions-'.$model->template_id]);

        return $this->getAjaxResponse('success', 'Question and its answers are successfully deleted.');
    }

    public function sort($order = 0, $id = 0)
    {
        if($id <> 0) {
            $model = $this->model->find($id);
            $model->order = $order;
            $model->save();
        } 
        return;
    }

    public function copyQuestion($question = null)
    {
        $user = auth()->user();
        if($question != null)
        {
            $question_input['title'] = $question->title.'(Copy)';
            $question_input['order'] = $question->order;
            $question_input['template_id'] = $question->template_id;
            $question_input['required'] = $question->required;
            $question_input['multiple_select'] = $question->multiple_select;
            $question_input['question_type'] = $question->question_type;

            $new_question = $this->model->create($question_input);
            $this->log->saveLog(['action' => 'Duplicate', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $new_question->id, 'sub_menu' => 'Questions-'.$question->template_id]);

            $answers = array();
            if(count($question->answers) > 0) {
                foreach ($question->answers as $answer) {
                    $answers['question_id'] = $answer->question_id;
                    $answers['name'] = $answer->name; 
                    $answers['order'] = $answer->order; 
                    $new_question->answers()->create($answers);
                }
            }

            return $this->model->find($question->id);
        }
    }

    public function getQuestionTypes()
    {
        return $this->model->questionTypes();
    }

    public function getTypes()
    {
        return [
            1 => 'text',
            2 => 'radiogroup',
            3 => 'checkbox'
        ];
    }
}