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

namespace QxCMS\Modules\Client\Repositories\Questionnaire;

use QxCMS\Modules\AbstractRepository;

use QxCMS\Modules\Client\Models\Questionnaire\Template;
use QxCMS\Modules\Client\Models\Settings\UserLogs\UserLogs as Log;
class TemplateRepository extends AbstractRepository implements TemplateRepositoryInterface
{
    protected $model;
    protected $log;

    function __construct(Template $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]);
        return $model;
    }

    public function _serialize(array $request)
    {
        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', 'Template successfully updated.');
            $this->log->saveLog(['action' => 'Update', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id]);
        }

        return $model;
    }

    public function delete($id)
    {
        $user = auth()->user();
        $model = $this->findById($id);
        $model->questions->each(function($value){
            $value->answers()->delete();
        });

        $model->questions()->delete();
        $model->delete();
        $this->log->saveLog(['action' => 'Delete', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $model->id]);
        return $this->getAjaxResponse('success', 'Template successfully deleted.');
    }

    public function copyTemplate($id)
    {
        $user = auth()->user();
        if($id)
        {
            $model = $this->model->with(['questions','questions.answers'])->find($id);
            if($model)
            {
                $templates['title'] = $model->title.'(Copy)';
                $templates['user_id'] = auth('client')->user()->id;
                $templates['description'] = $model->description;
                $templates['status'] = 'Open';
                $new_template = $this->model->create($templates);
                $this->log->saveLog(['action' => 'Duplicate', 'module_id' => $this->getModuleId(), 'user_id' => $user->id, 'data_id' => $new_template->id]);

                if(count($model->questions) > 0) {
                    $questions = array();
                    foreach ($model->questions as $question) {
                        $questions['title'] = $question->title;
                        $questions['order'] = $question->order;
                        $questions['template_id'] = $question->template_id;
                        $questions['required'] = $question->required;
                        $questions['multiple_select'] = $question->multiple_select;
                        $questions['question_type'] = $question->question_type;

                        $new_question = $new_template->questions()->create($questions);

                        if(isset($question->answers))
                        {
                            if(count($question->answers) > 0)
                            {
                                $answers = array();
                                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 $model;
    }

    public function select2($params = array())
    {
        if(!isset($params['title'])) $params['title'] = '';
        $model = $this->model
                        ->select(['title as text', 'id'])
                        ->searchByTitle($params['title'])
                        ->get();

        if(isset($params['placeholder'])) {
            $placeholder = array('text' => ' - All -', 'id' => '-1');
            if(isset($params['placeholder']['text'])) $placeholder = array('text' => $params['placeholder']['text'], 'id' => '-1');
             
            return  response(
                   array_prepend($model->toArray(), $placeholder)
                )->header('Content-Type', 'application/json');
        }
       
        return  response(
                       $model->toArray()
                    )->header('Content-Type', 'application/json');
    }


    public function findTemplateById($id, $relationships = [])
    {
        if(count($relationships)) {
            return $this->model->with($relationships)->find($id);
        }
        return  $this->model->find($id);
    }
     /*
    
    
    API REQUEST
     */
    public function apiGetQuestionnaire(array $request)
    {
        if(!isset($request['template_id'])) return array();
        return $this->model->with(['questions' => function($query) {
            $query->orderBy('order', 'ASC');
        }, 'questions.answers' => function($query){
            $query->orderBy('order', 'ASC');
        }])->find($request['template_id']);
    }
}