<?php

class UsuarioController extends Controller{

	// Layout
	public $layout='panel';

	/**
	 * @return array action filters
	 */
	public function filters(){
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules(){
		return array(
			array(
				'allow',  // allow all users to perform 'index' and 'view' actions
				'actions' => array('index', 'cambiar_clave', 'modificar'),
				'users' => ['@'],
			),
			array(
				'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	/*** Muestra los datos del Analista logeado ***/
	public function actionIndex(){
		$model = $this->loadModel(Yii::app()->user->id);

		$model->usua_habilitado = ($model->usua_habilitado) ? "Si" : "No";

		$usuario = SidcaiUsuario::model()->findByPk($model->audit_usua);

		if($usuario != null){
			$model->audit_usua = "<span data-tooltip='".$usuario->usua_nombre." ".$usuario->usua_apellido."'>".$usuario->usua_documento."</span>";	
		}

		$perfiles = "";
		$array_perfiles = Yii::app()->user->getState("perfiles");

		for($i = 0; $i < count(Yii::app()->user->getState("perfiles")); $i++){
			$perfil = SidcaiPerfil::model()->findByPk($array_perfiles[$i]);
			$perfiles .= $perfil->perf_descripcion."<br>";
		}

		$this->render('index', [
			'model' => $model,
			'perfiles' => $perfiles
		]);
	}

	/**
	 * Modifcar datos
	 */
	public function actionModificar(){
		$model = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);
		$model->scenario = "modificar";

		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiUsuario'])){
			if(isset($_POST['ok'])){			
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $_POST['SidcaiUsuario'], "modificar", Yii::app()->user->id);

				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			// Nacionalidas = "V" o "E"
			$model->usua_nacionalidad = substr($model->usua_documento, 0, 1);

			// Número de documento
			$model->usua_documento = substr($model->usua_documento, 1, 8);

			// Correo electrónico
			$correo = explode("@", $model->usua_correoelectronico);
			$model->usua_correoelectronico = $correo[0];
		}

		$this->render("modificar", ['model' => $model]);
	}

	/**
	 * Cambiar clave
	 */
	public function actionCambiar_clave(){
		$model = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);
		$model->scenario = 'cambioClave';

		if(isset($_POST['ajax']) && $_POST['ajax'] == 'cambio-clave-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
		
		if(isset($_POST['SidcaiUsuario'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->cambiar_clave($model, $_POST['SidcaiUsuario'], Yii::app()->user->id);

				echo json_encode($data);
			}
			Yii::app()->end();	
		}

		// Vista de protected/views/usuario
		$this->render("nueva-clave", array('model' => $model));
	}

	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return SidcaiUsuario the loaded model
	 * @throws CHttpException
	 */
	public function loadModel(int $id){
		$model=SidcaiUsuario::model()->findByPk($id);

		if($model===null)
			throw new CHttpException(404,'La página no existe');

		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param SidcaiUsuario $model the model to be validated
	 */
	protected function performAjaxValidation($model){
		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-usuario-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	/*********************************************************************************************

											Funciones

	*********************************************************************************************/
	/**
	 * Modificar la clave.
	 */
	private function cambiar_clave($model, array $post, int $id) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel"
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}	

		$model->attributes  = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiUsuario");
			return ["warning", $msj_error.$errores];
		}	

		$model_guardar = SidcaiUsuario::model()->findByPk($id);

		$model_guardar->usua_contrasena =  password_hash($model->contrasena_nueva, PASSWORD_DEFAULT);
		$model_guardar->usua_cambiocontrasena = 0;

		if($model_guardar->save())
			$guardar = ["success", "Se modificó la contraseña correctamente.", 'agregar'];
		else
			$guardar = ["danger", "No se logró modificar la contraseña."];

		unset($_POST['SidcaiUsuario']); // Se limpia el POST enviado por el formulario.
		$model_guardar->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}


	/**
		* Función parar que el usuario modifique algunos de sus datos.
		* @return array("alert", "mensaje", "(solo en $model->save()) agregar : modificar")
	**/
	private function guardar($model, array $post, string $accion, int $id = null) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel", "generarCodigo" y "enviarCorreo"..
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = mb_strtoupper(CHtml::encode($value));
		}

		$model->attributes  = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiUsuario");
			return ["warning", $msj_error.$errores];
		}

		// Una vez validado el $model se proceden a validar los datos.
		if(strpos($model->usua_correoelectronico, "@") !== false) 
			return ["warning", $msj_error.'<b>'.$model::attributeLabels()['usua_correoelectronico'].':</b> No ingrese el caracter "@".'];

		// Se comienza a pasar los datos.	
		$model_guardar = SidcaiUsuario::model()->findByPk($id);
		$model_guardar->usua_telefono 			= $model->usua_telefono;
		$model_guardar->usua_celular 			= $model->usua_celular;
		$model_guardar->usua_correoelectronico 	= $model->usua_correoelectronico . '@GMAIL.COM';
		$model_guardar->usua_cambiocontrasena 	= ($model->usua_cambiocontrasena) ? 1 : 0;
		$model_guardar->audit_usua 				= Yii::app()->user->id; // Usuario que está modificando el usuario.

		// Se guarda los datos del Usuario.
		if($model_guardar->save()){
			$guardar = ["success", "Se modificó los datos correctamente.", $accion];
		}else{	
			$guardar = ["danger", "No se logró modificar los datos."];
		}
	
		unset($_POST['SidcaiUsuario']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/


}

?>