<?php

class Users extends CActiveRecord {

    public $verifyCode;

    const ROLE_ADMIN = 'administrator';
    const ROLE_MODER = 'moderator';
    const ROLE_USER = 'user';
    const ROLE_BANNED = 'banned';

    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public function tableName() {
        return 'users';
    }

    public function rules() {
        return array(
            array('login, password', 'length', 'max' => 24, 'min' => 3),
            array('login, password', 'required'),
            array('side', 'required', 'message' => 'Необходимо выбрать сторону', 'on' => 'reg'),
            //array('avatar', 'numerical', 'max' => 61, 'min' => 11, 'message' => 'Недопустимый аватар.'),
            array('login', 'match', 'pattern' => '/^[A-Za-z0-9А-Яа-я\s,]+$/u', 'message' => 'Логин содержит недопустимые символы.'),
            array('password', 'authenticate', 'on' => 'login'),
            array('login, money, donate, chips, exp, level', 'safe'),
        );
    }

    public function safeAttributes() {
        return array('login', 'password');
    }

    public function attributeLabels() {
        return array(
            'login' => 'Имя персонажа',
            'password' => 'Пароль',
            'verifyCode' => 'Код проверки',
        );
    }

    // Проверяем были ли ошибки в других правилах валидации.
    public function authenticate($attribute, $params) {
        // Проверяем были ли ошибки в других правилах валидации.
        // если были - нет смысла выполнять проверку
        if (!$this->hasErrors()) {
            // Создаем экземпляр класса UserIdentity
            // и передаем в его конструктор введенный пользователем логин и пароль (с формы)
            $identity = new UserIdentity($this->login, $this->password);
            // Выполняем метод authenticate (о котором мы с вами говорили пару абзацев назад)
            // Он у нас проверяет существует ли такой пользователь и возвращает ошибку (если она есть)
            // в $identity->errorCode
            $identity->authenticate();

            // Теперь мы проверяем есть ли ошибка..    
            switch ($identity->errorCode) {
                // Если ошибки нету...
                case UserIdentity::ERROR_NONE: {
                        // Данная строчка говорит что надо выдать пользователю
                        // соответствующие куки о том что он зарегистрирован, срок действий
                        // у которых указан вторым параметром. 
                        Yii::app()->user->login($identity, 0);
                        break;
                    }
                case UserIdentity::ERROR_USERNAME_INVALID: {
                        // Если логин был указан наверно - создаем ошибку
                        $this->addError('login', 'Данные не совпадают');
                        break;
                    }
                case UserIdentity::ERROR_PASSWORD_INVALID: {
                        // Если пароль был указан наверно - создаем ошибку
                        $this->addError('password', 'Данные не совпадают');
                        break;
                    }
            }
        }
    }

    public function stats($id = NULL) {
        if ($id == NULL)
            $id = Yii::app()->user->id;
        $row = Yii::app()->db->createCommand(
                        "SELECT sum(`health`), sum(`attack`), sum(`deff`), sum(`accuracy`), sum(`dodge`), sum(`crit`), sum(`acrit`)
                FROM (
                SELECT `health`,`attack`,`deff`,`accuracy`,`dodge`,`crit`,`acrit` FROM `inventory` WHERE `user` = '$id' AND `put` = '1'
                UNION
                SELECT `health`,`attack`,`deff`,`accuracy`,`dodge`,`crit`,`acrit` FROM `users` WHERE `id` = '$id'
                ) as `total`"
                )->queryRow();
        if (!$row) {
            throw new CHttpException(404, 'Данный пользователь не существует');
        } else
            return $row;
    }

    public static function findUser($id = null) {
        if ($id == null)
            $id = Yii::app()->user->id;
        $user = self::model()->findByPk($id);
        if (!$user) {
            throw new CHttpException(404, 'Данный пользователь не существует');
        } else
            return $user;
    }

    public static function findAdversary($id = null) {
        if ($id == NULL)
            return 1;
        $adversary = self::findUser($id);
        if (!$adversary) {
            return 1;
        } else {
            $user = self::findUser();
            $max_level = $user->level + 2;
            $min_level = $user->level - 2;
            if ($adversary->level <= $max_level AND $adversary->level >= $min_level) {
                return 3;
            } else
                return 2;
        }
    }

    public function useEnergy($id) {
        $energy_bottle = Inventory::findInventory($id);
        $user = self::model()->findByPk(Yii::app()->user->id);
        if ($energy_bottle->user != Yii::app()->user->id OR $energy_bottle->type != 10) {
            throw new CHttpException(404, 'Предмет не найден');
        }
        $energy_to_fill_my = $user->energy_full - $user->energy;
        if ($energy_bottle->other_value >= $energy_to_fill_my) {
            $energy_to_fill = $energy_to_fill_my;
        } else {
            $energy_to_fill = $energy_bottle->other_value;
        }
        $user->saveCounters(array('energy' => $energy_to_fill));
        Inventory::model()->deleteByPk($id);
        Yii::app()->user->setFlash('success', 'Вы успешно восстановили ' . $energy_to_fill . ' едениц энергии!');
    }

    public function getexp($level) {
        $exp = new Helper();
        $my_exp = $exp->exp[$level];
        $my_money = $exp->money[$level];
        $rand_donate = rand(1, 100);
        $count_diamond = 0;
        if ($rand_donate <= 3) {
            $text_donate = ' и алмаз';
            $count_diamond = 1;
        }
        $expmoneyup = self::model()->findByPk(Yii::app()->user->id);
        $expmoneyup->saveCounters(array('exp' => $my_exp, 'money' => $my_money, 'donate' => $count_diamond));
        Yii::app()->user->setFlash('exp', '<p class="btn btn-danger btn-block" disabled="disabled">Вы получили <b>' . $my_exp . '</b> опыта и ' . $my_money . ' денег ' . $text_donate . '!</p>');
    }

    public function level_up() {
        $level_up = self::model()->findByPk(Yii::app()->user->id);
        $level_up->saveCounters(array('level' => 1));
        $user = self::model()->findUser();
        $hp = new Helper();
        self::model()->updateByPk(Yii::app()->user->id, array('exp' => 0, 'health' => $hp->hp[$user->level], 'energy' => $hp->energy[$user->level], 'energy_full' => $hp->energy[$user->level]));
        Yii::app()->user->setFlash('level', '<p class="btn btn-info btn-block" disabled="disabled">Уровень повысился! Здоровье увеличино до <b>' . $hp->hp[$user->level] . '</b></p>');
    }

    public function energySub() {
        $energy_count_sub = -10;
        $energySub = self::model()->findByPk(Yii::app()->user->id);
        $energySub->saveCounters(array('energy' => $energy_count_sub));
    }

    public function regeneration() {
        $user_me = self::findUser();
        if ($user_me->energy < $user_me->energy_full) {
            $time_to_reg = time() - $user_me->time_regeneration;
            $count_to_reg = round($time_to_reg / 30);
            if ($count_to_reg >= 1) {
                $my_maximum_energy_to_reg = $user_me->energy_full - $user_me->energy;
                if ($count_to_reg >= $my_maximum_energy_to_reg)
                    $count_to_reg = $my_maximum_energy_to_reg;
                self::model()->updateByPk(Yii::app()->user->id, array('energy' => intval($count_to_reg + $user_me->energy), 'time_regeneration' => time()));
            }
        }
    }

}
