<?php

/**
 * @class IdentificacionUsuario
 * @brief Realiza el proceso de identificación de un usuario en el sistema.
 *
 * @package application.components
 */
class IdentificacionUsuario extends CBaseUserIdentity {

    private $_id;
    public $email;
    public $password;

    // Constantes de error declaradas en la clase padre
    //const ERROR_NONE=0;
    //const ERROR_USERNAME_INVALID=1;
    //const ERROR_PASSWORD_INVALID=2;
    //const ERROR_UNKNOWN_IDENTITY=100;
    
    const ERROR_ESTADO_NOACTIVO=3;
    const ERROR_ESTADO_BORRADO=4;
    const ERROR_ESTADO_BLOQUEADO=5;
    
    /**
     * @brief Contructor.
     * @param string $email email
     * @param string $password password
     */
    public function __construct($email, $password) {
        $this->email = $email;
        $this->password = $password;
    }

    /**
     * @brief Comprueba que la identificación de un usuario es correcta.
     * @return boolean
     */
    public function authenticate() {
        $usuario = Usuario::model()->findByAttributes(array('email' => $this->email));
        $ph = new PasswordHash(
                Yii::app()->params['phpass']['iteration_count_log2'], 
                Yii::app()->params['phpass']['portable_hashes']
            );
        
        if ($usuario === NULL) {
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        } else {
            if (($usuario->password !== md5($this->password)) && !$ph->checkPassword($this->password, $usuario->password))
                $this->errorCode = self::ERROR_PASSWORD_INVALID;
            else if($usuario->estado == Usuario::ESTADO_NOACTIVO)
                $this->errorCode = self::ERROR_ESTADO_NOACTIVO;
            else if($usuario->estado == Usuario::ESTADO_BORRADO)
                $this->errorCode = self::ERROR_ESTADO_BORRADO;
            else if($usuario->estado == Usuario::ESTADO_BLOQUEADO)
                $this->errorCode = self::ERROR_ESTADO_BLOQUEADO;
            else {
                // Si el usuario tiene cifrada la contraseña con md5()
                // pasarla al nuevo método.
                if ($usuario->password{0} !== '$') {                    
                    $usuario->password = $ph->HashPassword($this->password);
                    $usuario->save();
                }
                $this->_id = $usuario->id;
                $this->errorCode = self::ERROR_NONE;
            }
        }
        return !$this->errorCode;
    }

    /**
     * @brief Devuelve el identificador único para la identidad del usuario
     * @return string.
     */
    public function getId() {
        return $this->_id;
    }

    /**
     * @brief Devuelve el email del usuario que está en sesión.
     * @return string
     */
    public function getName() {
        return $this->email;
    }
}