<?php

class SeguridadUsuarioController extends Controller {

    public $defaultAction = 'recuperar';

    /**
     * Realiza la recuperación de la contraseña de un usuario.
     * Este método es llamado por AJAX desde la página de entrada.
     * 
     */
    public function actionRecuperar() {
        $formulario = new FormularioRecuperarPassword;
        $resultado = array();

        // if it is ajax validation request
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form') {

            $formulario->email = $_POST['FormularioRecuperar_email'];

            if (!$formulario->validate()) {
                foreach ($formulario->getErrors() as $campo => $error) {
                    $resultado[$campo] = $error;
                }
                echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
                Yii::app()->end();
            }

            $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
            if ($usuario) {
                $this->enviarMailRecuperacion($usuario);

                $resultado['status'] = '200';
                $resultado['titulo'] = Yii::t('profind', 'Recuperación de su cuenta en PROFIND');
                $resultado['texto'] = Yii::t('profind', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en PROFIND.');
                echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
                Yii::app()->end();
            }
        }

        $this->redirect(Yii::app()->params['frontpage']);
    }

    /**
     * Cambiar la contraseña del usuario desde la página de entrada.
     * Este método es llamado por AJAX desde la página de entrada.
     * Envia un email de notificación al usuario.
     * @param integer ID del usuario
     */
    public function actionCambiarPasswordExt() {
        $formulario = new FormularioExtCambiarPassword;
        $resultado = array();

        if (isset($_POST['ajax']) && $_POST['ajax'] === 'cambiar-password-form-ext') {
            $formulario->key = $_POST['FormularioCambiarPassword_key'];
            $formulario->email = $_POST['FormularioCambiarPassword_email'];
            $formulario->password = $_POST['FormularioCambiarPassword_password'];
            $formulario->passwordRepetida = $_POST['FormularioCambiarPassword_password_repetida'];

            if ($formulario->validate()) {
                $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
                if ($this->_cambiarPassword($usuario->id, $formulario->password)) {
                    $resultado['status'] = '200';
                    $resultado['titulo'] = Yii::t('profind', 'Password modificada');
                    $resultado['texto'] = Yii::t('profind', 'Se ha modificado su password en PROFIND.');
                    echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
                    Yii::app()->end();
                } else {
                    foreach ($formulario->getErrors() as $campo => $error) {
                        $resultado[$campo] = $error;
                    }
                    echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
                    Yii::app()->end();
                }
            } else {
                foreach ($formulario->getErrors() as $campo => $error) {
                    $resultado[$campo] = $error;
                }
                echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
                Yii::app()->end();
            }
        }

        $this->redirect(Yii::app()->params['frontpage']);
    }

    /**
     * Cambiar la contraseña del usuario desde el formulario de la aplicación. 
     * Envia un email de notificación al usuario.
     * @param integer ID del usuario
     */
    public function actionCambiarPassword($id) {
        if ($id != Yii::app()->user->id)
            throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.'));

        $formulario = new FormularioCambiarPassword;

        if (isset($_POST['ajax']) && $_POST['ajax'] === 'cambiar-password-form') {
            echo CActiveForm::validate($formulario);
            Yii::app()->end();
        }

        if (isset($_POST['FormularioCambiarPassword'])) {
            $formulario->attributes = $_POST['FormularioCambiarPassword'];
            if ($formulario->validate() && $this->_cambiarPassword($id, $formulario->password)) {
                Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha modificado la contraseña'));
                $this->redirect(array('usuario/modificar', 'id' => $id));
            } else {
                Yii::app()->user->setFlash('error', Yii::t('profind', 'No se ha podido modificar la contraseña'));
                Yii::app()->user->setFlash('error', CHtml::errorSummary($formulario));
            }
        }
        $this->render('cambiar_password', array('formulario' => $formulario));
    }

    /**
     * Realiza el proceso interno de cambiar la contraseña a un usuario.
     * Envia un email de notificación al usuario.
     * Este método es privado y de uso interno al controlador.
     * @param integer ID del usuario
     * @param string nueva contraseña del usuario
     * @return boolean si se ha podido hacer o no el cambio
     */
    private function _cambiarPassword($id, $nueva_password) {
        $usuario = Usuario::model()->findByPk($id);
        if (!isset($usuario))
            throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.'));

        $usuario->password = $usuario->encrypt($nueva_password);
        $usuario->clave_seguridad = $usuario->encrypt(microtime() . $usuario->password);
        if ($usuario->save()) {
            $this->enviarMailNotificacionCambioPassword($usuario);
            return true;
        } else
            return false;
    }

    /**
     * Envía un mail de recuperación de password a un usuario con una URL.
     * @param Usuario $usuario Usuario al que se le enviará el mail de recuperación
     */
    private function enviarMailRecuperacion($usuario) {
        Yii::import('ext.yii-mail.YiiMailMessage');

        $url_modificacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email);

        $mensaje = new YiiMailMessage;
        $mensaje->from = Yii::app()->params['email_remitente'];
        $mensaje->setTo($usuario->email);
        $mensaje->subject = Yii::t('profind', 'Recuperación de su cuenta en PROFIND');
        $mensaje->view = 'recuperacion_password_usuario';
        $mensaje->setBody(array(
            'url' => $url_modificacion,
            'email' => $usuario->email
                ), 'text/html'
        );

        Yii::app()->mail->send($mensaje);
    }

    /**
     * Envía un mail confirmando el cambio de password a un usuario.
     * También se envio una URL de recuperacion por si fuera un cambio no permitido.
     * @param Usuario $usuario Usuario al que se le enviará el mail de notificación
     */
    private function enviarMailNotificacionCambioPassword($usuario) {
        Yii::import('ext.yii-mail.YiiMailMessage');

        $url_modificacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email);

        $mensaje = new YiiMailMessage;
        $mensaje->from = Yii::app()->params['email_remitente'];
        $mensaje->setTo($usuario->email);
        $mensaje->subject = Yii::t('profind', 'Se ha modificado su password en PROFIND');
        $mensaje->view = 'notificacion_cambio_password_usuario';
        $mensaje->setBody(array(
            'url' => $url_modificacion,
            'email' => $usuario->email
                ), 'text/html'
        );

        Yii::app()->mail->send($mensaje);
    }

}