<?php

class RegistroController extends Controller {

    public $defaultAction = 'registrar';

    /**
     * Declares class-based actions.
     */
    public function actions() {
        return array(
            'captcha' => array(
                'class' => 'CCaptchaAction',
                'backColor' => 0xFFFFFF,
            ),
        );
    }

    /**
     * @brief Realiza el registro de un usuario a partir de los datos introducidos
     * en el formulario de la página de entrada.
     * También envía un email al usuario para que confirme su cuenta si 'enviarMailActivacion' es 'true'.
     */
    public function actionRegistrar() {
        Yii::trace('Registrando un nuevo usuario', 'application.modules.usuario.RegistroController');

        Perfil::$regMode = true;

        $usuario = new FormularioRegistroUsuario;
        $perfil = new Perfil;

        // ajax validator
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'formulario-registro-usuario') {
            echo CActiveForm::validate(array($usuario, $perfil));
            Yii::app()->end();
        }

        if (Yii::app()->user->id) {
            $this->redirect(Yii::app()->controller->module->urlPerfil);
        } else {
            if (isset($_POST['FormularioRegistroUsuario'])) {
                $usuario->attributes = $_POST['FormularioRegistroUsuario'];
                $perfil->attributes = ((isset($_POST['Perfil']) ? $_POST['Perfil'] : array()));

                if ($usuario->validate() && $perfil->validate()) {
                    $passwordOriginal = $usuario->password;

                    // Rellenar los campos necesarios
                    $usuario->clave_activacion = UsuarioModule::cifrar(microtime() . $usuario->password);
                    $usuario->password = UsuarioModule::cifrar($usuario->password);
                    $usuario->confirmacion_password = UsuarioModule::cifrar($usuario->confirmacion_password);
                    $usuario->superusuario = 0;
                    $usuario->estado = ((Yii::app()->controller->module->activeAfterRegister) ? Usuario::ESTADO_ACTIVO : Usuario::ESTADO_NOACTIVO);

                    // Guardar el usuario y el perfil
                    $transaccion = Yii::app()->db->beginTransaction();
                    try {
                        Yii::trace('Guardando el nuevo usuario', 'application.modules.usuario.RegistroController');
                        if (!$usuario->save())
                            throw new CException('Error al guardar el usuario');

                        Yii::trace('Guardando el perfil del usuario', 'application.modules.usuario.RegistroController');
                        $perfil->usuario_id = $usuario->id;
                        if (!$perfil->save())
                            throw new CException('Error al guardar el perfil');

                        $transaccion->commit();
                        Yii::trace('Nuevo usuario dado de alta', 'application.modules.usuario.RegistroController');
                    } catch (Exception $e) {
                        Yii::trace($e->getMessage(), 'application.modules.usuario.RegistroController');

                        $transaccion->rollBack();
                        $errores = array_merge($usuario->getErrors(), $perfil->getErrors());
                        foreach ($errores as $campo => $mensaje)
                            $resultado[$campo] = $mensaje;
                        Yii::trace(CVarDumper::dumpAsString($resultado), 'application.modules.usuario.RegistroController');

                        //echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
                        Yii::app()->end();
                    }

                    if (Yii::app()->controller->module->enviarMailActivacion) {
                        Yii::trace('Hay que enviar un correo de activación al usuario', 'application.modules.usuario.RegistroController');
                        if (EMail::enviarBienvenidaUsuario($usuario->email, $usuario->clave_activacion)) {
                            Yii::trace('Correo para activar el usuario enviado', 'application.modules.usuario.RegistroController');
                        } else {
                            Yii::trace('Error al enviar el correo para activar el usuario', 'application.modules.usuario.RegistroController');
                        }
                    }

                    if ((Yii::app()->controller->module->loginSinActivacion || (Yii::app()->controller->module->activarAutomaticamente && Yii::app()->controller->module->enviarMailActivacion == false)) && Yii::app()->controller->module->autoLogin) {
                        Yii::trace('Entrar directamente sin esperar a la activación', 'application.modules.usuario.RegistroController');
                        $identity = new UserIdentity($usuario->username, $passwordOriginal);
                        $identity->authenticate();
                        Yii::app()->user->login($identity, 0);
                        $this->redirect(Yii::app()->homeUrl);
                    } else {
                        if (!Yii::app()->controller->module->activarAutomaticamente && !Yii::app()->controller->module->enviarMailActivacion) {
                            Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Contact Admin to activate your account."));
                        } elseif (Yii::app()->controller->module->activarAutomaticamente && Yii::app()->controller->module->enviarMailActivacion == false) {
                            Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please {{login}}.", array('{{login}}' => CHtml::link(UsuarioModule::t('Login'), Yii::app()->controller->module->urlLogin))));
                        } elseif (Yii::app()->controller->module->loginSinActivacion) {
                            Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please check your email or login."));
                        } else {
                            Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please check your email."));
                        }
                        $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
                    }
                }
            }
            else
                $perfil->validate();
        }
        $this->render('registro', array('model' => $usuario, 'perfil' => $perfil));
    }

    /**
     * @brief Activa la cuenta del usuarios a partir de la URL de activación
     * que se le ha enviado a través del email generado en el proceso de 
     * registro.
     */
    public function actionActivar() {
        Yii::trace('Activando usuario', 'application.modules.usuario.RegistroController');

        $email = Yii::app()->request->getQuery('email');
        $clave_activacion = Yii::app()->request->getQuery('key');

        if ($email && $clave_activacion) {
            $usuario = Usuario::model()->notsafe()->findByAttributes(array('email' => $email));

            // Comprobamos si se ha encontrado un usuario con ese email
            if (!isset($usuario)) {
                Yii::trace('No existe el email', 'application.modules.usuario.RegistroController');
                Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. La URL de activación es incorrecta."));
                $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
            } elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) {
                Yii::trace('El usuario ya está activo', 'application.modules.usuario.RegistroController');
                Yii::app()->user->setFlash('registro', UsuarioModule::t("No se ha realizado ningún cambio. La cuenta ya estaba activada."));
                $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
            } elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) {
                Yii::trace('El usuario está bloqueado', 'application.modules.usuario.RegistroController');
                Yii::app()->user->setFlash('registro', UsuarioModule::t("La cuenta ha sido bloqueada. Contacte con el administrador del sitio para obtener más información."));
                $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
            } elseif (isset($usuario->clave_activacion) && ($usuario->clave_activacion === $clave_activacion)) {
                Yii::trace('Guardando el usuario', 'application.modules.usuario.RegistroController');

                // Hay que activar el usuario
                $usuario->estado = Usuario::ESTADO_ACTIVO;
                $usuario->clave_activacion = UsuarioModule::cifrar(microtime() . $usuario->password);
                $usuario->save();
                Yii::trace('Usuario activado', 'application.modules.usuario.RegistroController');

                EMail::enviarConfirmacionActivacion($usuario->email);

                Yii::app()->user->setFlash('registro', UsuarioModule::t("Gracias por registrarse en FactuGES. Su cuenta ha sido confirmada."));
                $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
            } else {
                Yii::trace('Clave de seguridad no válida', 'application.modules.usuario.RegistroController');
                Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. El enlace de activación es incorrecto."));
                $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
            }
        } else {
            Yii::trace('URL de activación no válida', 'application.modules.usuario.RegistroController');
            Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. El enlace de activación es incorrecto."));
            $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
        }
    }

    /**
     * @brief Realiza la recuperación de la contraseña de un usuario.
     */
    public function actionRecuperar() {
        Yii::trace('Recuperar la cuenta del usuario', 'application.modules.usuario.RegistroController');

        $formulario = new FormularioRecuperarUsuario;

        if (Yii::app()->user->id) {
            $this->redirect(Yii::app()->controller->module->returnUrl);
        } else {
            if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form-entrada') {
                $formulario->email = $_POST['FormularioRecuperar_email'];

                if (!$formulario->validate())
                    $this->performAjaxValidationMessage($formulario);

                $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
                if ($usuario) {
                    if (EMail::enviarRecuperacion($usuario->email, $usuario->clave_seguridad)) {
                        Yii::trace('Correo para recuperar la cuenta enviado', 'application.modules.usuario.RegistroController');
                        $this->performAjaxStatusMessage('success', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en FactuGES.')
                        );
                    } else {
                        Yii::trace('Error al enviar el correo para recuperar la cuenta', 'application.modules.usuario.RegistroController');
                        $this->performAjaxStatusMessage('success', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'No se ha podido enviar el correo para recuperar su cuenta a la dirección indicada.')
                        );
                    }
                } else {
                    Yii::trace('No se encontrado un usuario con el email indicado', 'application.modules.usuario.RegistroController');
                    $this->performAjaxStatusMessage('failure', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'No se encontrado un usuario con el email indicado.')
                    );
                }
            }
            $this->redirect(Yii::app()->params['frontpage']);
        }

        $this->render('recovery', array('form' => $form));
    }

}

