<?php

/**
 * Yii-User module
 * 
 * @author Mikhail Mangushev <mishamx@gmail.com> 
 * @link http://yii-user.2mx.org/
 * @license http://www.opensource.org/licenses/bsd-license.php
 * @version $Id: UserModule.php 132 2011-10-30 10:45:01Z mishamx $
 */
class UsuarioModule extends CWebModule {

    /**
     * @var int
     * @desc items on page
     */
    public $user_page_size = 10;

    /**
     * @var int
     * @desc items on page
     */
    public $fields_page_size = 10;

    /**
     * @var string
     * @desc hash method (md5,sha1 or algo hash function http://www.php.net/manual/en/function.hash.php)
     */
    public $hash = 'md5';

    /**
     * @var boolean
     * @desc use email for activation user account
     */
    public $enviarMailActivacion = true;

    /**
     * @var boolean
     * @desc allow auth for is not active user
     */
    public $loginNotActiv = false;

    /**
     * @var boolean
     * @desc activate user on registration (only $sendActivationMail = false)
     */
    public $activeAfterRegister = false;

    /**
     * @var boolean
     * @desc login after registration (need loginNotActiv or activeAfterRegister = true)
     */
    public $autoLogin = true;
    public $urlRegistro = array("/usuario/registro");
    public $urlRecuperar = array("/usuario/recuperar/recuperar");
    public $urlLogin = array("/usuario/login");
    public $urlLogout = array("/usuario/logout");
    public $urlPerfil = array("/usuario/perfil");
    public $returnUrl = array("/usuario/perfil");
    public $returnLogoutUrl = array("/usuario/login");

    /**
     * @var int
     * @desc Remember Me Time (seconds), defalt = 2592000 (30 days)
     */
    public $rememberMeTime = 2592000; // 30 days
    public $fieldsMessage = '';

    /**
     * @var array
     * @desc User model relation from other models
     * @see http://www.yiiframework.com/doc/guide/database.arr
     */
    public $relations = array();

    /**
     * @var array
     * @desc Profile model relation from other models
     */
    public $profileRelations = array();

    /**
     * @var boolean
     */
    public $captcha = array('registration' => true);

    /**
     * @var boolean
     */
    //public $cacheEnable = false;

    public $tablaUsuarios = '{{usuarios}}';
    public $tablaPerfiles = '{{perfiles}}';
    public $tablaCamposPerfiles = '{{campos_perfiles}}';
    
    public $defaultScope = array(
        'with' => array('perfil'),
    );
    
    static private $_usuario;
    static private $_usuarios = array();
    static private $_userByName = array();
    static private $_admin;
    static private $_admins;

    /**
     * @var array
     * @desc Behaviors for models
     */
    public $componentBehaviors = array();

    public function init() {
        // this method is called when the module is being created
        // you may place code here to customize the module or the application
        // import the module-level models and components
        $this->setImport(array(
            'usuario.models.*',
            'usuario.components.*',
        ));
    }

    public function getBehaviorsFor($componentName) {
        if (isset($this->componentBehaviors[$componentName])) {
            return $this->componentBehaviors[$componentName];
        } else {
            return array();
        }
    }

    public function beforeControllerAction($controller, $action) {
        if (parent::beforeControllerAction($controller, $action)) {
            // this method is called before any module controller action is performed
            // you may place customized code here
            return true;
        }
        else
            return false;
    }

    /**
     * @param $str
     * @param $params
     * @param $dic
     * @return string
     */
    public static function t($str = '', $params = array(), $dic = 'usuario') {
        if (Yii::t("UsuarioModule", $str) == $str)
            return Yii::t("UsuarioModule." . $dic, $str, $params);
        else
            return Yii::t("UsuarioModule", $str, $params);
    }

    /**
     * @return hash string.
     */
    public static function encrypting($string = "") {
        $hash = Yii::app()->getModule('usuario')->hash;
        if ($hash == "md5")
            return md5($string);
        if ($hash == "sha1")
            return sha1($string);
        else
            return hash($hash, $string);
    }

    /**
     * @param $place
     * @return boolean 
     */
    public static function doCaptcha($place = '') {
        if (!extension_loaded('gd'))
            return false;
        if (in_array($place, Yii::app()->getModule('usuario')->captcha))
            return Yii::app()->getModule('usuario')->captcha[$place];
        return false;
    }

    /**
     * Return admin status.
     * @return boolean
     */
    public static function isAdmin() {
        if (Yii::app()->user->isGuest)
            return false;
        else {
            if (!isset(self::$_admin)) {
                if (self::usuario()->superusuario)
                    self::$_admin = true;
                else
                    self::$_admin = false;
            }
            return self::$_admin;
        }
    }

    /**
     * Return admins.
     * @return array syperusers names
     */
    public static function getAdmins() {
        if (!self::$_admins) {
            $admins = Usuario::model()->activo()->superusuario()->findAll();
            $return_name = array();
            foreach ($admins as $admin)
                array_push($return_name, $admin->username);
            self::$_admins = ($return_name) ? $return_name : array('');
        }
        return self::$_admins;
    }

    /**
     * Send to user mail
     */
    public static function sendMail($email, $subject, $message) {
        $adminEmail = Yii::app()->params['adminEmail'];
        $headers = "MIME-Version: 1.0\r\nFrom: $adminEmail\r\nReply-To: $adminEmail\r\nContent-Type: text/html; charset=utf-8";
        $message = wordwrap($message, 70);
        $message = str_replace("\n.", "\n..", $message);
        return mail($email, '=?UTF-8?B?' . base64_encode($subject) . '?=', $message, $headers);
    }

    /**
     * Send to user mail
     */
    public function sendMailToUser($user_id, $subject, $message, $from = '') {
        $user = Usuario::model()->findbyPk($user_id);
        if (!$from)
            $from = Yii::app()->params['adminEmail'];
        $headers = "From: " . $from . "\r\nReply-To: " . Yii::app()->params['adminEmail'];
        return mail($user->email, '=?UTF-8?B?' . base64_encode($subject) . '?=', $message, $headers);
    }

    /**
     * Return safe user data.
     * @param user id not required
     * @return user object or false
     */
    public static function usuario($id = 0, $clearCache = false) {
        if (!$id && !Yii::app()->user->isGuest)
            $id = Yii::app()->user->id;
        if ($id) {
            if (!isset(self::$_usuarios[$id]) || $clearCache)
                self::$_usuarios[$id] = Usuario::model()->with(array('perfil'))->findbyPk($id);
            return self::$_usuarios[$id];
        }
        else
            return false;
    }

    /**
     * Return safe user data.
     * @param user name
     * @return user object or false
     */
    public static function getUserByName($username) {
        if (!isset(self::$_userByName[$username])) {
            $_userByName[$username] = Usuario::model()->findByAttributes(array('username' => $username));
        }
        return $_userByName[$username];
    }

    /**
     * Return safe user data.
     * @param user id not required
     * @return user object or false
     */
    public function users() {
        return User;
    }

}
