<?php

class Question {
    /*** プロパティ定義 ***/
    private $id; // Integer
    private $question; // String
    private $correctAnswers; // Array<String>
    private $incorrectAnswers; // Array<String>

    /*** コンストラクタ ***/
    function __construct ($anId, $aQuestion, $aCorrectAnswers, $aIncorrectAnswers) {
        $this -> setId($anId);
        $this -> setQuestion($aQuestion);
        $this -> setCorrectAnswers($aCorrectAnswers);
        $this -> setIncorrectAnswers($aIncorrectAnswers);
    }

    /*** getter/setter定義 ***/
    public function getId(){
        return $this -> id;
    }
    public function setId($anId){
        $aString = gettype ($anId);
        // 引数がInteger型でない場合、Integerにキャスト
        if ($aString != 'integer') {
            $anIdInteger = (integer) $anId;
        } else {
            $anIdInteger = $anId;
        }
        $this -> id = $anIdInteger;
    }
    public function getQuestion(){
        return $this -> question;
    }
    public function setQuestion($aQuestion){
        //引数がString型でない場合、Stringにキャスト
        $aString = gettype ($aQuestion);
        if ($aString != 'string') {
            $aQuestionString = (string) $aQuestion;
        } else {
            $aQuestionString = $aQuestion;
        }
        $this -> question = $aQuestionString;
    }
    public function getCorrectAnswers(){
        return $this -> correctAnswers;
    }
    public function setCorrectAnswers($aCorrectAnswers){
        $aString = gettype ($aCorrectAnswers);
        // Array型であればそのまま変数に格納
        if ($aString == 'array') {
            $anArray = $aCorrectAnswers;
        }
        // Array型でなければ...
        else {
            // String型でない場合、Stringにキャスト
            if ($aString != 'string') {
                $aCorrectAnswersString = (string) $aCorrectAnswers;
            }
            // String型であればそのまま変数に格納
            else {
                $aCorrectAnswersString = $aCorrectAnswers;
            }
            // 引数の文字列を[","]でセパレートして配列に格納する
            $anArray = $this -> separateJSONStringAsArray($aCorrectAnswersString);
        }
        // このクラスのプロパティに配列変数を束縛
        $this -> correctAnswers = $anArray;
    }
    public function getIncorrectAnswers(){
        return $this -> incorrectAnswers;
    }
    public function setIncorrectAnswers($aIncorrectAnswers){
        $aString = gettype($aIncorrectAnswers);
        if ($aString == 'array') {
            $anArray = $aIncorrectAnswers;
        }
        else {
            if ($aString != 'string') {
                $aIncorrectAnswersString = (string) $aIncorrectAnswers;
            } else {
                $aIncorrectAnswersString = $aIncorrectAnswers;
            }
            $anArray = $this -> separateJSONStringAsArray($aIncorrectAnswersString);   
        }
        $this -> incorrectAnswers = $anArray;
    }

    // 指定した文字列が正解群（correctAnswers）に含まれるか否かの真偽値を応答する。
    public function isCorrect($aString) {
        $argumentString = $aString;
        $correctAnswersArray = $this -> correctAnswers;

        foreach ($correctAnswersArray as $anElement) {
            if ($argumentString == $anElement) {
                return true;
            }
        }

        return false;
    }

    // 正解群をJSON配列形式で応答する。ex) ["answer1", "answer2", "answer3"]
    public function getCorrectAnswersInJSON() {
        $correctAnswersArray = $this -> correctAnswers;
        $aJSONString = '[';
        $correctAnswersArraySize = count($correctAnswersArray);
        $aCounter = 1;

        foreach ($correctAnswersArray as $anElement) {
            $aJSONString .= '"';
            $aJSONString .= $anElement;
            $aJSONString .= '"';
            if ($aCounter != $correctAnswersArraySize) {
                $aJSONString .= ',';    
            }
            $aCounter++;
        }
        $aJSONString .= ']';

        return $aJSONString;
    }

    // 不正解群をJSON配列形式で応答する。ex) ["answer1", "answer2", "answer3"]
    public function getIncorrectAnswersInJSON() {
        $incorrectAnswersArray = $this -> incorrectAnswers;
        $aJSONString = '[';
        $incorrectAnswersArraySize = count($incorrectAnswersArray);
        $aCounter = 1;

        foreach ($incorrectAnswersArray as $anElement) {
            $aJSONString .= '"';
            $aJSONString .= $anElement;
            $aJSONString .= '"';
            if ($aCounter != $incorrectAnswersArraySize) {
                $aJSONString .= ',';    
            }
            $aCounter++;
        }
        $aJSONString .= ']';

        return $aJSONString;        
    }

    /*** Utilityメソッド群 ***/
    //JSON形式の文字列を配列に格納する。
    //文字列'["aiu","eo"]'を引数に入れると、
    //配列array(2) { [0]=> string(1) "aiu" [1]=> string(1) "eo" }を応答する。
    private function separateJSONStringAsArray($aString){
        $editString = $aString;
        $editString = $this -> trimFirstAndLastCharacter($editString);
        $aStringArray = explode(',' , $editString);
        $index = 0;
        foreach ($aStringArray as $anElement) {
            $anElement = $this -> trimFirstAndLastCharacter($anElement);
            $aStringArray[$index] = $anElement;
            $index++;
        }
        return $aStringArray;
    }
    //文字列の最初と最後の文字を一つずつ削除する。
    //文字列'["aiu","eo"]'を引数に入れると、
    //'"aiu","eo"'を応答する。
    private function trimFirstAndLastCharacter($aString){
        $cut = 1; //カットしたい文字数
        $aString = substr( $aString , $cut , strlen($aString)-$cut );
        $aString = substr( $aString , 0 , strlen($aString)-$cut );
        return $aString;
    }
}

?>