<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

namespace MXTranslator;

defined('MOODLE_INTERNAL') || die();

use \stdClass as PhpObj;

class Controller extends PhpObj {
    protected $repo;
    public static $routes = [
        '\core\event\course_viewed' => 'CourseViewed',
        '\core\event\course_completed' => 'CourseCompleted',
        '\mod_page\event\course_module_viewed' => 'ModuleViewed',
        '\mod_quiz\event\course_module_viewed' => 'ModuleViewed',
        '\mod_url\event\course_module_viewed' => 'ModuleViewed',
        '\mod_folder\event\course_module_viewed' => 'ModuleViewed',
        '\mod_forum\event\course_module_viewed' => 'ModuleViewed',
        '\mod_forum\event\discussion_viewed' => 'DiscussionViewed',
        '\mod_forum\event\user_report_viewed' => 'ModuleViewed',
        '\mod_book\event\course_module_viewed' => 'ModuleViewed',
        '\mod_scorm\event\course_module_viewed' => 'ModuleViewed',
        '\mod_resource\event\course_module_viewed' => 'ModuleViewed',
        '\mod_choice\event\course_module_viewed' => 'ModuleViewed',
        '\mod_data\event\course_module_viewed' => 'ModuleViewed',
        '\mod_feedback\event\course_module_viewed' => 'ModuleViewed',
        '\mod_lesson\event\course_module_viewed' => 'ModuleViewed',
        '\mod_lti\event\course_module_viewed' => 'ModuleViewed',
        '\mod_wiki\event\course_module_viewed' => 'ModuleViewed',
        '\mod_workshop\event\course_module_viewed' => 'ModuleViewed',
        '\mod_chat\event\course_module_viewed' => 'ModuleViewed',
        '\mod_glossary\event\course_module_viewed' => 'ModuleViewed',
        '\mod_imscp\event\course_module_viewed' => 'ModuleViewed',
        '\mod_survey\event\course_module_viewed' => 'ModuleViewed',
        '\mod_facetoface\event\course_module_viewed' => 'ModuleViewed',
        '\mod_quiz\event\attempt_abandoned' => 'AttemptAbandoned',
        '\mod_quiz\event\attempt_preview_started' => 'AttemptStarted',
        '\mod_quiz\event\attempt_reviewed' => 'AttemptReviewed',
        '\mod_quiz\event\attempt_viewed' => 'ModuleViewed',
        '\mod_quiz\event\attempt_submitted' => ['AttemptSubmitted', 'QuestionSubmitted'],
        '\core\event\user_loggedin' => 'UserLoggedin',
        '\core\event\user_loggedout' => 'UserLoggedout',
        '\mod_assign\event\submission_graded' => 'AssignmentGraded',
        '\mod_assign\event\assessable_submitted' => 'AssignmentSubmitted',
        '\core\event\user_created' => 'UserRegistered',
        '\core\event\user_enrolment_created' => 'EnrolmentCreated',
        '\mod_scorm\event\sco_launched' => 'ScormLaunched',
        '\mod_feedback\event\response_submitted' => ['FeedbackSubmitted', 'FeedbackQuestionSubmitted'],
        '\mod_facetoface\event\signup_success' => 'FacetofaceEnrol',
        '\mod_facetoface\event\cancel_booking' => 'FacetofaceUnenrol',
        '\mod_facetoface\event\take_attendance' => 'FacetofaceAttend',
        '\mod_scorm\event\scoreraw_submitted' => 'ScormScoreRawSubmitted',
        '\mod_scorm\event\status_submitted' => 'ScormStatusSubmitted',
    ];

    /**
     * Constructs a new Controller.
     */
    public function __construct() {
        // Empty.
    }

    /**
     * Creates a new event.
     * @param [String => Mixed] $events
     * @return [String => Mixed]
     */
    public function create_events(array $events) {
        $results = [];
        foreach ($events as $index => $opts) {
            $route = isset($opts['event']['eventname']) ? $opts['event']['eventname'] : '';
            if (isset(static::$routes[$route])) {
                $routeevents = is_array(static::$routes[$route]) ? static::$routes[$route] : [static::$routes[$route]];
                foreach ($routeevents as $routeevent) {
                    try {
                        $event = '\MXTranslator\Events\\' . $routeevent;
                        foreach ((new $event())->read($opts) as $index => $result) {
                                array_push($results, $result);
                        }
                    } catch (UnnecessaryEvent $ex) { // @codingStandardsIgnoreLine
                        // Empty.
                    }
                }
            }
        }
        return $results;
    }
}