<?php

/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity{
	/**
	 * Authenticates a user.
	 * The example implementation makes sure if the username and password
	 * are both 'demo'.
	 * In practical applications, this should be changed to authenticate
	 * against some persistent user identity storage (e.g. database).
	 * @return boolean whether authentication succeeds.
	 */

	public $tipo_documento;
	public $documento;
	public $clave;

	private $opcion;

	private $_id;

	public function __construct($documento, $clave, $tipo_documento, $opcion){
		parent::__construct($documento, $clave);
		$this->documento = $documento;
		$this->clave = $clave;
		$this->tipo_documento = $tipo_documento;
		$this->opcion = $opcion;
	}

	public function authenticate(){
		if($this->opcion == 1){
			return $this->loginEmpresa();
		}else{
			return $this->loginUsuario();
		}
	}

	public function getId(){
        return $this->_id;
    }

    private function loginEmpresa(){
    	$rif = $this->tipo_documento.$this->documento;
		$empresa = SidcaiAportante::model()->find('apor_rif = :apor_rif', [':apor_rif' => $rif]);	

		if($empresa === null){
			$this->errorCode=self::ERROR_USERNAME_INVALID;
		}
		elseif(!password_verify($this->clave, $empresa->apor_contrasena)){
			$this->errorCode=self::ERROR_PASSWORD_INVALID;
		}elseif($empresa->apor_habilitado == false){
			$this->errorCode = 99; // 99 => Empresa deshabilitada
		}else{
			$this->_id = $empresa->apor_codigo_pk;

			//IF para comprobar si la empresa va a cambiar la contraseña
			if($empresa->apor_cambiocontrasena){
				Yii::app()->request->cookies['cambio_contrasena'] = new CHttpCookie('cambio_contrasena', $empresa->apor_cambiocontrasena);
				Yii::app()->request->cookies['id_empresa'] = new CHttpCookie('id_empresa', $empresa->apor_codigo_pk);
			}

			// Datos de la empresa
			$this->setState('id_representante', $empresa->repr_codigo_fk);
			$this->setState('razon_social', $empresa->apor_razonsocial);
			$this->setState('denominacion_comercial', $empresa->apor_denominacion);
			$this->setState('rif', $empresa->apor_rif);
			$this->setState('correo', $empresa->apor_correoelectronico);
			$this->errorCode=self::ERROR_NONE;		
		}

		return $this->errorCode;
    }

    private function loginUsuario(){
    	$documento = $this->tipo_documento.$this->documento;

		$usuario = SidcaiUsuario::model()->find([
			'condition' => 'usua_documento = :usua_documento',
			'params' => [':usua_documento' => $documento]
		]);

		if($usuario == NULL){
			$this->errorCode=self::ERROR_USERNAME_INVALID;
		}else if(!password_verify($this->clave, $usuario->usua_contrasena)){
			$this->errorCode=self::ERROR_PASSWORD_INVALID;
		}else if($usuario->usua_habilitado == false){
			$this->errorCode = 99; // 99 => Usuario deshabilitado
		}else{
			//IF para comprobar si el ususario va a cambiar la contraseña
			if($usuario->usua_cambiocontrasena){
				Yii::app()->request->cookies['cambio_contrasena_sistema'] = new CHttpCookie('cambio_contrasena_sistema', $usuario->usua_cambiocontrasena);
				Yii::app()->request->cookies['id_usuario'] = new CHttpCookie('id_usuario', $usuario->usua_codigo_pk);
			}

			$this->_id = $usuario->usua_codigo_pk;


			// Datos del usuario
			$this->setState('cedula', $usuario->usua_documento);
			$this->setState('nombre_usuario', $usuario->usua_nombre." ".$usuario->usua_apellido);
			$this->setState('cargo', $usuario->usua_cargo);
			$this->setState('correo', $usuario->usua_correoelectronico);

			$perfiles_usuario = SidcaiPerfilUsuario::model()->findAll([
				'condition' => 'usua_codigo_fk = :usua_codigo_fk',
				'params' => [':usua_codigo_fk' => $usuario->usua_codigo_pk]
			]);

			if($perfiles_usuario != null){		
				$perfil = SidcaiPerfil::model()->findByPk($perfiles_usuario[0]->perf_codigo_fk);
				// Se obtiene el acceso del usuario
				$tipo_acceso = SidcaiTipoacceso::model()->findByPk($perfil->tipo_codigo_fk);
				$this->setState('tipo_acceso', $tipo_acceso->tipo_descripcion);
				$this->setState('nivel_acceso', $tipo_acceso->tipo_codigo_pk);

				// La variable $perfiles guardará los perfiles de la tabla Sidcai_Perfil que tiene asignado el usuario
				$perfiles = array();
				
				foreach($perfiles_usuario as $p){
					$perfiles[] = $p->perf_codigo_fk;
				}
				
				$this->setState('perfiles', $perfiles);
				$this->errorCode=self::ERROR_NONE;
			}else{
				$this->errorCode = 999; // 999 => No se pudo encontrar los datos
			}
		}

		return $this->errorCode;
    }

}