<?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/>.

/**
 * User evidence persistent.
 *
 * @package    core_competency
 * @copyright  2015 Frédéric Massart - FMCorz.net
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

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

use context_user;
use lang_string;

/**
 * User evidence persistent class.
 *
 * @package    core_competency
 * @copyright  2015 Frédéric Massart - FMCorz.net
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class user_evidence extends persistent {

    const TABLE = 'competency_userevidence';

    /**
     * Return the definition of the properties of this model.
     *
     * @return array
     */
    protected static function define_properties() {
        return array(
            'userid' => array(
                'type' => PARAM_INT
            ),
            'name' => array(
                'type' => PARAM_TEXT
            ),
            'description' => array(
                'type' => PARAM_CLEANHTML,
                'default' => '',
            ),
            'descriptionformat' => array(
                'choices' => array(FORMAT_HTML, FORMAT_MOODLE, FORMAT_PLAIN, FORMAT_MARKDOWN),
                'type' => PARAM_INT,
                'default' => FORMAT_HTML,
            ),
            'url' => array(
                'type' => PARAM_URL,
                'default' => '',
                'message' => new lang_string('invalidurl', 'core_competency')
            )
        );
    }

    /**
     * Can the current user manage this user evidence?
     *
     * @return bool
     */
    public function can_manage() {
        return self::can_manage_user($this->get('userid'));
    }

    /**
     * Can the current user view this user evidence?
     *
     * @return bool
     */
    public function can_read() {
        return self::can_read_user($this->get('userid'));
    }

    /**
     * Get the context of this user evidence.
     *
     * @return context
     */
    public function get_context() {
        return context_user::instance($this->get('userid'));
    }

    /**
     * Get link competencies.
     */
    public function get_competencies() {
        return user_evidence_competency::get_competencies_by_userevidenceid($this->get('id'));
    }

    /**
     * Get link user competencies.
     */
    public function get_user_competencies() {
        return user_evidence_competency::get_user_competencies_by_userevidenceid($this->get('id'));
    }

    /**
     * Return true if the user of the evidence has plan.
     *
     * @return bool
     */
    public function user_has_plan() {
        return plan::record_exists_select('userid = ?', array($this->get('userid')));
    }

    /**
     * Return the files associated with this evidence.
     *
     * @return object[]
     */
    public function get_files() {
        $fs = get_file_storage();
        $files = $fs->get_area_files($this->get_context()->id, 'core_competency', 'userevidence', $this->get('id'),
            'filename', false);
        return $files;
    }

    /**
     * Validate the URL.
     *
     * @param  int $value
     * @return true|lang_string
     */
    protected function validate_url($value) {
        if (empty($value) && !is_numeric($value)) {
            return true;
        }
        if (!preg_match('@^https?://.+@', $value)) {
            return new lang_string('invalidurl', 'core_competency');
        }
        return true;
    }

    /**
     * Validate the user ID.
     *
     * @param  int $value
     * @return true|lang_string
     */
    protected function validate_userid($value) {
        global $DB;

        // During create.
        if (!$this->get('id')) {

            // Check that the user exists. We do not need to do that on update because
            // the userid of an evidence should never change.
            if (!$DB->record_exists('user', array('id' => $value))) {
                return new lang_string('invaliddata', 'error');
            }

        }

        return true;
    }

    /**
     * Can the current user manage a user's evidence?
     *
     * @param  int $evidenceuserid The user to whom the evidence would belong.
     * @return bool
     */
    public static function can_manage_user($evidenceuserid) {
        global $USER;
        $context = context_user::instance($evidenceuserid);

        $capabilities = array('moodle/competency:userevidencemanage');
        if ($context->instanceid == $USER->id) {
            $capabilities[] = 'moodle/competency:userevidencemanageown';
        }

        return has_any_capability($capabilities, $context);
    }

    /**
     * Can the current user view a user's evidence?
     *
     * @param  int $evidenceuserid The user to whom the evidence would belong.
     * @return bool
     */
    public static function can_read_user($evidenceuserid) {
        $context = context_user::instance($evidenceuserid);

        $capabilities = array('moodle/competency:userevidenceview');

        return has_any_capability($capabilities, $context) || self::can_manage_user($evidenceuserid);
    }

}
