<?php 
Class Usuario_ori extends AppObjeto{
	
	
	
	public $USUARIO_WEB;
	public $CONTRASE_WEB;
	public $CHOFER;
	public $EMPRESA;
	public $TELEFONO;
	public $MOVIL;
	
	//campos
	public $perfiles = array();
	public $invitado = false; 
	public $token;

	
	
	/*
	 *Datos para el login 
	 * 
	 */
	
	public $nombre_nick= 'USUARIO_WEB';
	public $nombre_pass= 'CONTRASE_WEB';
	public $tratamiento_clave = '';
	public $extra_sql_validacion = '';
		
	/*
	 * 
	 *Datos de tabla
	 *
	 */
	
	protected $_name = 'POTENCIALES';
	protected $_primary = 'NUMERO';
	
	public static $name = 'POTENCIALES';
	public static $primary = 'NUMERO';
	
	
	const NOT_IDENTITY = 'notIdentity';
	const INVALID_CREDENTIAL = 'invalidCredential';
	const INVALID_USER = 'invalidUser';
	const INVALID_LOGIN = 'invalidLogin';
	
	//const ACL_EMPLEADO = 'empleado';
	//const ACL_ADMINISTRADOR = 'administrador';
		
	protected $_messages = array(
		self::NOT_IDENTITY	=> 'Acceso denegado.',
		self::INVALID_CREDENTIAL => 'Acceso denegado.',
		self::INVALID_USER => 'Acceso denegado.',
		self::INVALID_LOGIN => 'Acceso denegado.',
		
	);
	
	
	public function initMetaDatos(){
		$this->setMetadato('CHOFER', 'CHOFER');
		$this->setMetadato('TELEFONO', 'TELEFONO');
		$this->setMetadato('MOVIL', 'MOVIL');
		$this->setMetadato('USUARIO_WEB', 'USUARIO_WEB');
		$this->setMetadato('CONTRASE_WEB', 'CONTRASE_WEB');
		parent::getTiposMetadatos();
	}
	
	/*public function initMetaDatos(){
		parent::initMetaDatos();
		$this->setMetadato ( 'perfiles', 'perfiles');
		$clave = $this->getMetadato('clave');
		$this->setMetadato('clave', 'clave', $clave['tipo'], 'cambiarPass');
	}*/
	
	public function load($id){
		parent::load($id);
		if($this->id){
			if (!$this->EMPRESA) {
				$this->EMPRESA = '00';
			}
		}
	}
	
	
	public function getAlias(){
		return $this->alias;
	}
	
	public function save(){
		parent::save();
		try {
			$this->guradaPerfiles();
		} catch (Exception $e) {
		}
		
	}
	private function loadPerfiles(){
		
		$db = $this->getDb();
		$select = $db->select();
		$select->setIntegrityCheck(false);
		$select->from(array('a' => 'usuario_has_perfil'), array('id_perfil'));
		$select->joinLeft(array('p'=>'perfil'), 'p.id_perfil = a.id_perfil',array('nombre_maquina'));
		$select->where('id_usuario = ?', $this->id);
		$resultado = $db->fetchAll($select);
		if ($resultado)
			$resultado = $resultado->toArray();

		// cargar los nombres de máquina
		$maquina_superadmin = Configuracion::get(self::SUPER_ADMINISTRADOR);
		$maquina_cliente = Configuracion::get(self::CLIENTE);
		$maquina_cliente_administrador = Configuracion::get(self::CLIENTE_ADMINISTRADOR);
		$maquina_invitado = Configuracion::get(self::INVITADO);
		$maquina_administrador = Configuracion::get(self::ADMINISTRADOR);
		
		foreach ($resultado as $elemento) {
			$this->perfiles[] = $elemento['id_perfil'];
			switch ($elemento['nombre_maquina']){
				case $maquina_superadmin: 
					$this->_perfilSuperAdministrador = true;
					break;
				case $maquina_administrador: 
					$this->_perfilAdministrador = true;
					break;
				case $maquina_cliente_administrador: 
					$this->_perfilClienteAdministrador = true;
					break;
				case $maquina_cliente: 
					$this->_perfilCliente = true;
					break;
				case $maquina_invitado: 
					$this->_perfilInvitado = true;
					break;
			}
			//print_r($this);
		}
		
	}
	
	private function guradaPerfiles(){
		if (isset($this->id)) {
			try
			{
			$dbAdapter = $this->getDb()->getAdapter();
			
			$sql = 'DELETE FROM usuario_has_perfil WHERE id_usuario ='.$this->id;
			$stmt = $dbAdapter->prepare($sql);
			$stmt->execute();
			if(is_array($this->perfiles))
				foreach ($this->perfiles as $idPerfil) {
					
					$sql = 'insert into usuario_has_perfil(id_usuario, id_perfil) values ('.
							$this->id. ', '. $idPerfil.')';
					
					$stmt = $dbAdapter->prepare($sql);
					$stmt->execute();
				}
			
			}
			catch (Exception $e) {
				echo $e->getMessage();
				die();
			}
				
		}
	}
	
	
	/**
	 * 
	 * Nos dice si hay algun usuario logueado
	 */
	public static function isLoggedIn()
	{
		return Zend_Auth::getInstance()->hasIdentity();
	}
	
	public function logeaActual(){

		$columna_nick = $this->nombre_nick;
		$columna_pass = $this->nombre_pass;
		$nick =$this->$columna_nick;
		$clave = $this->$columna_pass;
		
			$db = $this->getDb();
			Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
			$autAdapter = new Zend_Auth_Adapter_DbTable($db->getDefaultAdapter());
			$autAdapter->setTableName($this->_name);
			$autAdapter->setIdentityColumn($columna_nick);
			$autAdapter->setCredentialColumn($columna_pass);
			$autAdapter->setIdentity($nick);
			$autAdapter->setCredential($clave);
			//$autAdapter->setCredentialTreatment($this->tratamiento_clave);
			if(strlen($this->extra_sql_validacion)>0)
				$autAdapter->getDbSelect()->where($this->extra_sql_validacion);
				
			$aut = Zend_Auth::getInstance();
				
			$result = $aut->authenticate($autAdapter);
			
			switch ($result->getCode())
			{
				case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
		
					throw new Exception($this->_messages[self::NOT_IDENTITY]);
					break;
				case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
						
					throw new Exception($this->_messages[self::INVALID_CREDENTIAL]);
					break;
				case Zend_Auth_Result::SUCCESS:
					if ($result->isValid()) {
		
		
		
						$data = $autAdapter->getResultRowObject();
		
						//	$nameid = $this->nombreId();
						// Comprobar que existe el id y está activo
						//	if($data->$nameid < 1){
						//		$this->logout();
						//		throw new Exception($this->_messages[self::INVALID_CREDENTIAL]);
						//	}
						//agregamos permiso usuario añadiendo los permisos basicos para un usuario logueado
		
		
						$aut->getStorage()->write($data);
					} else {
						echo 'esta mal';
						die();
						throw new Exception($this->_messages[self::INVALID_USER]);
					}
					break;
				default:
					throw new Exception($this->_messages[self::INVALID_LOGIN]);
					break;
			}
		
	}
	
	public function login($nick, $password)
	{
		
		
		if(!empty($nick) && !empty($password))
		{
			$db = $this->getDb();
			Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
			$autAdapter = new Zend_Auth_Adapter_DbTable($db->getDefaultAdapter());
			$autAdapter->setTableName($this->_name);
			$autAdapter->setIdentityColumn($this->nombre_nick);
			$autAdapter->setCredentialColumn($this->nombre_pass);
			$autAdapter->setIdentity($nick);
			$autAdapter->setCredential($password);
			$autAdapter->setCredentialTreatment($this->tratamiento_clave);
			if(strlen($this->extra_sql_validacion)>0)
				$autAdapter->getDbSelect()->where($this->extra_sql_validacion);
			
			$aut = Zend_Auth::getInstance();
			
			$result = $aut->authenticate($autAdapter);
			switch ($result->getCode())
			{
				case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
														
					throw new Exception($this->_messages[self::NOT_IDENTITY]);
					break;
				case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
					
					throw new Exception($this->_messages[self::INVALID_CREDENTIAL]);
					break;
				case Zend_Auth_Result::SUCCESS:
					if ($result->isValid()) {



						$data = $autAdapter->getResultRowObject();

					//	$nameid = $this->nombreId();
						// Comprobar que existe el id y está activo
					//	if($data->$nameid < 1){
					//		$this->logout();
					//		throw new Exception($this->_messages[self::INVALID_CREDENTIAL]);
					//	}
						//agregamos permiso usuario añadiendo los permisos basicos para un usuario logueado
						
						
						$aut->getStorage()->write($data);
					} else {
						echo 'esta mal';
						die();
						throw new Exception($this->_messages[self::INVALID_USER]);
					}
					break;
				default:
					throw new Exception($this->_messages[self::INVALID_LOGIN]);
					break;
			}
		} else {
			throw new Exception($this->_messages[self::INVALID_LOGIN]);
		}
		
	}
	
	
	
	public function loginWs($nick, $password)
	{
	
		if(!empty($nick) && !empty($password))
		{
			$db = $this->getDb();
			Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
			$autAdapter = new Zend_Auth_Adapter_DbTable($db->getDefaultAdapter());
			$autAdapter->setTableName($this->_name);
			$autAdapter->setIdentityColumn($this->nombre_nick);
			
			$autAdapter->setCredentialColumn($this->nombre_pass);
			$autAdapter->setIdentity($nick);
			$autAdapter->setCredential($password);
			$autAdapter->setCredentialTreatment($this->tratamiento_clave);
			if(strlen($this->extra_sql_validacion)>0)
				$autAdapter->getDbSelect()->where($this->extra_sql_validacion);
				
			$aut = Zend_Auth::getInstance();
				
			$result = $aut->authenticate($autAdapter);
		
			switch ($result->getCode())
			{
				case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
	
					return false;
				case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
						
					return false;
				case Zend_Auth_Result::SUCCESS:
					if ($result->isValid()) {
	
	
	
						$data = $autAdapter->getResultRowObject();
	
							$nameid = $this->nombreId();
						// Comprobar que existe el id y está activo
						//	if($data->$nameid < 1){
						//		$this->logout();
						//		throw new Exception($this->_messages[self::INVALID_CREDENTIAL]);
						//	}
						//agregamos permiso usuario añadiendo los permisos basicos para un usuario logueado
	
	
						$acceso = new Acceso();
						$acceso->id_usuario = $data->$nameid;;
						$acceso->save();
						$this->logout();
						
						return  $acceso->token;
						
						
						
						
					} else {
						return false;
					}
					break;
				default:
					return false;
					break;
			}
		} else {
			return false;
		}
	
	}

	
	public function getIdentity()
	{
		$auth = Zend_Auth::getInstance();
		if ($auth->hasIdentity()) {
			$clave = $this->getPrimary();
			$this->load($auth->getIdentity()->$clave);
		}
		
	}
	
	public static function UsuarioLoqueado(){
		
		$usuario = new Usuario();
		$usuario->getIdentity();
		return $usuario;
	}
	/*Indica si el usuario esta logueado*/
	public function logout()
	{
		Zend_Auth::getInstance()->clearIdentity();
		Session::borrarSesiones();
	}
	
	public function cambiarPass($pass){
		$this->clave = md5($pass);
		$this->save();
		
	}
	
	public static function getByToken($token){
		$select = self::camposConsulta();
		$select->where('token=?', $token);
		
		
		$row = self::fetchRow($select);
		
		if(count($row)>0){
			$usuario = new Usuario($row->id_usuario);
			return $usuario;
		}
	}
	
	public function recuperaPass($email){
		$select = $this->camposConsulta();
		$select->where('email=?', $email);
		
		
		$row = $this->fetchRow($select);
		
		if(count($row)>0){
		
			$usuario = new Usuario($row->id_usuario);
			$usuario->token = $this->generaToken(20);
			$usuario->save();
			$email = new Email();
	    	$email->url_nueva_pass = 'http://'.$_SERVER['HTTP_HOST']. BASEURL.'/usuarios/recuperanuevapass?token='.$usuario->token;
	    	$email->setVista('recuperapass');
	    	$email->setAsunto('Recuperación de contraseña');
	    	$email->addDestinatario($usuario->nombre, $usuario->email);
	    	$email->enviar();
	    
		}
		
		
	}
	
}