<?php

class PancekQuizController extends BaseController
{
    public function form()
    {
        return new SimpleResponse(PancekQuiz::getForm());
    }

    public function submit()
    {
        // mulai validasi
        $params = $this->validate(
            $this->request->getJsonRawBody(true),
            [
                'id' => ['validators' => [
                    'required',
                    'digit'
                ]],
                'nama' => ['validators' => [
                    'required',
                    [
                        'name' => 'max_string',
                        'params' => 100
                    ]
                ]],
                'email' => ['validators' => [
                    'required',
                    'email',
                    [
                        'name' => 'max_string',
                        'params' => 100
                    ]
                ]],
                'provinsi_id' => ['validators' => [
                    'required',
                    'digit'
                ]],
                'answers' => ['validators' => [
                    'required'
                ]]
            ]
        );

        if (!is_array($params['answers'])) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Format payload tidak valid");
        }
        foreach ($params['answers'] as $answer) {
            $this->validate($answer, [
                'question_id' => ['validators' => ['required', 'digit']],
                'answer_id' => ['validators' => ['required', 'digit']]
            ]);
        }
        $exist = MasterProvinsi::findFirst(['conditions' => 'provinsi_code = :value:', 'bind' => ['value' => $params['provinsi_id']]]);
        if (!$exist) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Data provinsi tidak valid");
        }

        $this->db->begin();
        try {
            // done validasi, mulai menyimpan data header
            $exam = new PancekQuizExam();
            $exam->quiz_id = $params['id'];
            $exam->nama = $params['nama'];
            $exam->email = $params['email'];
            $exam->provinsi_id = $params['provinsi_id'];
            if (!$exam->save()) {
                $this->throwObjectValidationException($exam);
            }

            // done menyimpan data header, mulai menyimpan data items
            // mengambil jumlah pertanyaan dan kunci jawaban
            $totalQuestions = PancekQuizQuestion::countTotalByQuiz($params['id']);
            $refAnswers = PancekQuizAnswer::getAsReference('id');

            $totalScore = 0;
            foreach ($params['answers'] as $answer) {
                $examAnswer = new PancekQuizExamAnswer();
                $examAnswer->exam_id = $exam->id;
                $examAnswer->question_id = $answer['question_id'];
                $examAnswer->answer_id = $answer['answer_id'];
                $examAnswer->score = $refAnswers[$examAnswer->answer_id]['score'];
                $totalScore += $examAnswer->score;

                if (!$examAnswer->save()) {
                    $this->throwObjectValidationException($examAnswer);
                }
            }
            $score = ($totalScore/$totalQuestions) * 100;
            $exam->score = $score;
            if (!$exam->save()) {
                $this->throwObjectValidationException($exam);
            }
            $this->db->commit();

            return new SimpleResponse($score);
        } catch (\Exception $e) {
            $this->db->rollback();
            throw $e;
        }
    }

    public function formAnswer()
    {
        $form = PancekQuiz::getForm();
        $answers = [];
        foreach ($form['questions'] as $question) {
            $a = [];
            foreach ($question['answers'] as $answer) {
                $a['question_id'] = $question['id'];
                $a['answer_id'] = $answer['id'];
            }
            array_push($answers, $a);
        }

        return new SimpleResponse($answers);
    }
}
