<?php  

class RegistroController extends Controller{
	
	public $layout = "main";

    /**
	 * @return array action filters
	 */
	public function filters(){
		return array(
			'accessControl', // perform access control for CRUD operations
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules(){
		// Me falta colocar "correcto" en otro lugar ya que se puede ingresar como invitado.
		return array(
			array('allow',
				'actions' => array('municipios', 'parroquias', 'validarCorreo'),
				'users' => array('*'),
			),
			array(
				'allow',
				'actions' => array('correcto'),
				'expression' => array($this, 'permitirCorrecto')
			),
			array('allow',
				'actions'=>array('enviar'),
				'expression' => array($this, 'permitirEnviar'),
			),
			array('allow',
				'actions'=>array('codigo'),
				'expression' => array($this, 'permitirCodigo'),
			),	
			array('allow', 
				'actions'=>array('index'),
				'expression' => array($this, 'permitirRegistro'),
			),		
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * action donde muestra el formulario de registro del aportante/representante/usuario.
	 */
	public function actionIndex(){
		$model 	= new SidcaiAportante('agregar');
		$model2 = new SidcaiRepresentantelegal('agregar');

		// Solo se valida SidcaiUsuario porque tiene una validación personalizada
		$this->performAjaxValidation($model, 'sidcai-aportante-form');

		//Compruebo si existe las session "tipo" y "documento" enviadas desde el index de Home
		if(Yii::app()->user->hasState('tipo') && Yii::app()->user->hasState('documento')){
			$model->apor_rif = Yii::app()->user->getState('tipo') . Yii::app()->user->getState('documento');
		}

		// Fecha de hoy.
		$date = new DateTime("now", new DateTimeZone('America/Caracas'));

		if(Yii::app()->user->hasState('permitir_registro')){
			if(isset($_POST['SidcaiAportante'], $_POST['SidcaiRepresentantelegal'])){
				$atributos_aportante = [];
				$atributos_representante = [];

				foreach($_POST['SidcaiAportante'] as $key => $value){
					$atributos_aportante[$key] = mb_strtoupper(CHtml::encode($value));
				}

				foreach($_POST['SidcaiRepresentantelegal'] as $key => $value){
					$atributos_representante[$key] = mb_strtoupper(CHtml::encode($value));
				}

				$model->attributes 	= $atributos_aportante;
				$model2->attributes = $atributos_representante;
				
				// Hace unas validaciones previa.
				$this->validar($model, $model2);

				if($model->validate() && $model2->validate()){
					// Se importa el controlador para hacer uso de las funciones "generarCodigo" y "enviarCorreo".
					Yii::import('application.controllers.FuncionesController');

					// Datos Aportante
					$model->apor_fechahoraregistro 	= $date->format('Y-m-d H:i:s');
					$model->apor_fechahoraestatus 	= $date->format('Y-m-d H:i:s');
					$model->apor_actividadeconomica = "ACTIVIDAD ECONÓMICA";
					$model->esta_codigoestatus_fk 	= 2008; // Aportante que aún está en proceso de registro.
					$model->apor_origenempresa 		= 1;
					// $model->tipo_codigo_fk => Codigo que se refiere al tipo de tecnologia de la tabla sidcai_tipotecnologia
					$model->tipo_codigo_fk 			= 1;
					$model->apor_correoelectronico 	= $model->apor_correoelectronico. '@GMAIL.COM';
					$model->repetir_correo 			= $model->repetir_correo. '@GMAIL.COM';

					// Clave del aportante.
					$clave = FuncionesController::generarCodigo(10, 4);
					$model->apor_contrasena = password_hash($clave, PASSWORD_DEFAULT);

					// Datos Representante Legal
					/**
					 * Primero se valida que no exista un Representante Legal con el mismo documento.
					 * En caso de existir, se buscará el Representante y solo se hará un actualización,
					 * de lo contrario, hará el registro del mismo.
					 */

					$nacionalidad_representante = $model2->repr_nacionalidad;

					$model2->repr_documento 		= $nacionalidad_representante.$model2->repr_documento;
					$model2->repr_correoelectronico = $model2->repr_correoelectronico. "@GMAIL.COM";

					$existe_representante = SidcaiRepresentantelegal::model()->find(
						'repr_documento = :repr_documento',
						array(':repr_documento' => $model2->repr_documento)
					);

					if($existe_representante != null){
						$model2 = $existe_representante;
						$model2->repr_nacionalidad = $nacionalidad_representante;
					}
					/** 	FIN REPRESENTANTE EXISTE		 ***/

					//El primero que va a guardar es Model2 por ser el Representante Legal
					$transaction = $model2->dbConnection->beginTransaction();
					
					if($model2->save()){
						// Se asigna el Representante al Aportante
						$model->repr_codigo_fk = $model2->repr_codigo_pk;

						if($model->save()){
							//BORRAR, SOLO SE USARÁ PARA PROBAR SIN INTERNET
							// Yii::app()->user->setState('codigo_borrar', $clave); 

							// Datos a enviar al correo.
							$correo = $model->apor_correoelectronico;
							$nombres = $model->apor_razonsocial;
							$titulo = "SIDCAI - Registro de empresa";
							$datos = [];
							$datos['rif'] = $model->apor_rif;
							$datos['clave'] = $clave;
							$mensaje = $this->mensaje_registro($datos);

							/**
							 *	Comentar el if si no hay internet. 
							 **/
							if(FuncionesController::enviarCorreo([$correo], [$nombres], $titulo, $mensaje)){
								$transaction->commit();
								Yii::app()->user->setState('permitir_registro', null);
								Yii::app()->user->setState('tipo', null);
								Yii::app()->user->setState('documento', null);

								Yii::app()->user->setState('correcto', "ok"); // 10 minutos estará visible la página de "registro/correcto".

								$this->redirect(Yii::app()->homeUrl. "registro/correcto");
							}else{
								Yii::app()->user->setFlash('error_registro', "¡Ups! No se logró enviar el mensaje al correo electrónico.");
							}
						}else{
							// Yii::app()->user->setFlash('error_registro', "¿Acá? Model 1");
						}
					}else{
						// Yii::app()->user->setFlash('error_registro', "¿Acá? Model 2");
					}
					$transaction->rollBack();

					$correo_aportante = explode("@", $model->apor_correoelectronico);
					$model->apor_correoelectronico = $correo_aportante[0];

					$correo_representante = explode("@", $model2->repr_correoelectronico);
					$model2->repr_correoelectronico = $correo_representante[0];

					// Nacionalidad Representante Legal
					$model2->repr_nacionalidad = substr($model2->repr_documento, 0, 1);

					// Número de documento Representante Legal
					$model2->repr_documento = substr($model2->repr_documento, 1, 8);
				}else{
					Yii::app()->user->setFlash('error_warning', "Por favor verifique los campos requeridos.");
				}
				// Si llega acá es que hubo un error en un campo o algún error en el registro.
				Yii::app()->user->setFlash('error_registro', "<b>¡Ups!</b> Hubo un error al registrarse, por favor intente más tarde.");
			}
		}

		$model->apor_fechahoraregistro = $date->format('d/m/Y');

		$this->render("index", 
			[
				'model'  => $model,
				'model2' => $model2,
			]
		);
	}

	/**
	 * Enviar código al correo electrónico.
	 */
	public function actionEnviar(){
		$model = new ValidarFormEnviarCodigo;

		$this->performAjaxValidation($model, 'enviar-form');

		// Si existe las variables de sesion, que mande los valores a los input
		if(Yii::app()->user->hasState('tipo') && Yii::app()->user->hasState('documento'))
			$model->documento_r = Yii::app()->user->getState('tipo').Yii::app()->user->getState('documento');

		if(isset($_POST['ValidarFormEnviarCodigo'])){
			$model->attributes = $_POST['ValidarFormEnviarCodigo'];

			if($model->validate()){
				Yii::import('application.controllers.FuncionesController');

				// Se Genera el código y clave temporal que es enviado al correo electrónico
				Yii::app()->user->setState('clave_temporal',FuncionesController::generarCodigo(6, 3));
				//Yii::app()->user->setState('clave_temporal', "123456");
				Yii::app()->user->setState('enviar', null);
				Yii::app()->user->setState('codigo', 'ok'); // Sesion que me permite ingresar a la página del código de confirmación.

				// Datos enviados al correo del usuario.
				$mensaje = [];
				$mensaje['rif'] = $model->documento_r;
				$mensaje['codigo'] = Yii::app()->user->getState('clave_temporal');

				/**
				 * Comentar if si no hay Internet.
				 */
				if(FuncionesController::enviarCorreo([$model->email. "@gmail.com"], [""] ,"SIDCAI - Clave de Confirmacion", $this->mensaje_codigo($mensaje))){

					$cookie = new CHttpCookie('codigo', $mensaje['codigo']);
					$cookie->expire = time() + 60 * 60; // 60 minutos que tendrá el usuario para ingresar el código.
					Yii::app()->request->cookies['codigo'] = $cookie;

					$this->redirect(Yii::app()->homeUrl.'registro/codigo');
				}else{
					$model->addError('email', 'No se logró enviar el código a su correo. Por favor, intente más tarde.');
				}
			}
		}
		
		$this->render('enviar', array('model' => $model));
	}

	/**
	 * Valida si el código enviado al correo es igual al igresado por el usuario.
	 * De ser correcto, elimina él acceso a este mismo action.
	 */
	public function actionCodigo(){
		$model = new ValidarFormCodigo;

		$this->performAjaxValidation($model, 'codigo-form');

		if(isset($_POST['ValidarFormCodigo'])){
			$model->attributes = $_POST['ValidarFormCodigo'];

			if(Yii::app()->user->hasState('clave_temporal') && Yii::app()->user->hasState('codigo')){
				// Código que es envíado al correo del usuario.
				$codigo = Yii::app()->user->getState('clave_temporal');

				// Se borran las variables de sesiones anteriores para que no pueda ingresar de nuevo a las páginas.
				Yii::app()->user->setState('clave_temporal', null);
				Yii::app()->user->setState('codigo', null);

				// Se crea la variable de sesión que permite entrar al formulario de registro.
				Yii::app()->user->setState('permitir_registro', 'SI');

				if(strcmp($model->codigo, $codigo) === 0){
					$this->redirect(Yii::app()->homeUrl.'registro');
				}else{
					Yii::app()->user->setFlash('error', "El código ingresado es incorrecto. Por favor, realice el proceso nuevamente.");
					$this->redirect(Yii::app()->homeUrl);
				}
			}
		}

		$this->render('codigo', array('model' => $model));
	}

	public function actionCorrecto(){
		Yii::app()->user->setState("correcto", null);

		$this->render('registro-correcto');
	}

	//Mostrar Municipios de Aportante/Representante cuando uno se registra y modifica
	public function actionMunicipios(){
		if(isset($_POST['id_estado'])){
			$id_estado = $_POST['id_estado'];

			$lista = SidcaiMunicipio::model()->findAll(
				array(
					'condition' => 'esta_codigo_fk = :esta_codigo_fk',
					'params' => array(':esta_codigo_fk' => $id_estado),
					'order' => 'muni_nombre'
				)
			);

			echo "<option value>Seleccione un Municipio.</option>";

			foreach($lista as $l){
				echo '<option value="'.$l->muni_codigo_pk.'">'.$l->muni_nombre.'</option>';
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	} 

	//Mostrar Parroquias de Aportante/Representante cuando uno se registra y modifica
	public function actionParroquias(){
		if(isset($_POST['id_municipio'])){
			$id_municipio = $_POST['id_municipio'];

			$lista = SidcaiParroquia::model()->findAll(
				array(
					'condition' => 'muni_codigo_fk = :muni_codigo_fk',
					'params' => array(':muni_codigo_fk' => $id_municipio),
					'order' => 'parr_nombre'
				)
			);

			echo "<option value>Seleccione una Parroquia.</option>";

			foreach($lista as $l){
				echo '<option value="'.$l->parr_codigo_pk.'">'.$l->parr_nombre.'</option>';
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}

	} 

	/**
	 * Valida que solo pueda existir un correo por empresa.
	 */
	public function actionValidarCorreo(){
		if(isset($_POST['correo'])){
			$correo = $_POST['correo'];

			if(strlen($correo) > 4){
				$data['existe'] = 0;
				$correo = mb_strtoupper($correo)."@GMAIL.COM";

				$empresa = SidcaiAportante::model()->find('apor_correoelectronico = :apor_correoelectronico', [':apor_correoelectronico' => $correo]);

				if($empresa != null){
					$data['existe'] = 1;
				}

				echo json_encode($data);
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}


	/*********************************************************************************************

											Funciones

	*********************************************************************************************/
	/**
	 * Performs the AJAX validation.
	 * @param SidcaiRepresentantelegal $model the model to be validated
	 */
	protected function performAjaxValidation($model, string $form){
		if(isset($_POST['ajax']) && $_POST['ajax'] === $form){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	/**
	 * Valida los model.
	 */
	private function validar($model, $model2){
		// Validar Aportante
		if(strpos($model->apor_correoelectronico, "@") !== false)
			return Yii::app()->user->setFlash('warning_registro', 'No ingrese el caracter "@" en el campo de correo electrónico de la empresa.');

		if(strpos($model->repetir_correo, "@") !== false)
			return Yii::app()->user->setFlash('warning_registro', 'No ingrese el caracter "@" en el campo de repetir correo electrónico de la empresa.');

		if(!is_numeric($model->apor_zonapostal)) 
			return Yii::app()->user->setFlash('warning_registro', 'Solo inserte números en la Zona Postal de la empresa.');

		if(!is_numeric($model->apor_telefono1)) 
			return Yii::app()->user->setFlash('warning_registro', 'El número de teléfono de la empresa es inválido.');

		if($model->apor_telefono2 != "" && !is_numeric($model->apor_telefono2))
			return Yii::app()->user->setFlash('warning_registro', 'El número de teléfono de la empresa es inválido.');


		// Validar Representante
		if(strpos($model2->repr_correoelectronico, "@") !== false)
			return Yii::app()->user->setFlash('warning_registro', 'No ingrese el caracter "@" en el campo de correo electrónico del Representante Legal.');

		if(!is_numeric($model2->repr_documento)) 
			return Yii::app()->user->setFlash('warning_registro', 'El documento del Representante Legal es inválido.');

		if(!is_numeric($model2->repr_telefono)) 
			return Yii::app()->user->setFlash('warning_registro', 'El número de teléfono del Representante Legal es inválido.');

		if($model2->repr_celular != "" && !is_numeric($model2->repr_celular))
			return Yii::app()->user->setFlash('warning_registro', 'El número de teléfono del Representante Legal es inválido.');

		if(!is_numeric($model2->repr_zonapostal)) 
			return Yii::app()->user->setFlash('warning_registro', 'Solo inserte número en la Zona Postal del Representante Legal.');
	}

	/**
	 * Cuerpo de mensaje al enviar el código para iniciar con el proceso de registro del Aportante.
	 */
	private function mensaje_codigo(array $datos) : string{
		$mensaje = "";
		$mensaje .= "Verifique si el RIF es correcto<br>";
		$mensaje .= "Su RIF es: <b>". $datos['rif']."</b><br><br>";
		$mensaje .= "Ingrese el siguiente código para iniciar con el proceso de registro de empresa.<br><br>";
       	$mensaje .= "Código: <b>".$datos['codigo']."<br>";
       	$mensaje .= "<br><b>Solo dispone de 60 minutos para ingresar el código, de lo contrario, tendrá que iniciar el proceso nuevamente.</b>";

       	return $mensaje;
	}

	/**
	 * Cuerpo del mensaje a enviar al registrarse
	 */
	private function mensaje_registro(array $datos) : string{
		$mensaje = "";
		$mensaje .= '<p>Bienvenido al <strong>Sistema para Declaración y control del Aporte-Inversión en Ciencia, Tecnología e ';
		$mensaje .= 'Innovación</strong>.<br /><br>';
		$mensaje .=	'Su Registro ha finalizado exitosamente, para ingresar en el sistema, deberá usar la siguiente información:<br /><br />';

		$mensaje .= 'RIF: <b>' .mb_strtoupper($datos['rif']). '</b><br />';
		$mensaje .= 'Clave (Temporal) : <b>' .$datos['clave']. '</b><br />';

		$mensaje .= "<br><br>";
		$mensaje .= "Por medidas de seguridad se le pedirá el cambio de la clave al ingresar.";

		return $mensaje;

	}

	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/

	//Permite la entrada a la página de enviar código
	public function permitirEnviar(){
		if(Yii::app()->user->hasState('enviar'))
			return true;
		else
			$this->redirect(Yii::app()->homeUrl);

	}

	//Permite la entrada a la página de ingresar el código
	public function permitirCodigo(){
		if(Yii::app()->user->hasState('codigo')){
			if(empty(Yii::app()->request->cookies['codigo']->value))
				$this->redirect(Yii::app()->homeUrl);
			else
				return true;
		}
		else
			$this->redirect(Yii::app()->homeUrl);
	}

	//Permite la entrada a la página de index de registro
	public function permitirRegistro(){
		if(Yii::app()->user->hasState('permitir_registro'))
			return true;
		else
			$this->redirect(Yii::app()->homeUrl);
	}

	// Permite la entrada a la página "Registro-correcto"
	// Solo estará 10 minutos.
	public function permitirCorrecto(){
		if(Yii::app()->user->hasState('correcto'))
			return true;
		else
			$this->redirect(Yii::app()->homeUrl);
	}

}

?>