/**
 * Se encarga de actualizar los datos del usuario que recibe, en la
 * base de datos.
 */
void Servicio::administrarPerfil() {

	string nombreUsuario = this->getParametro(keyNombre, keyDefault);
	string estadoDeConexion = this->getParametro(keyEstadoDeConexion,
			keyDefault);
	string fotoDePerfil = this->getParametro(keyFotoDePerfil, keyDefault);
	bool estado = StringUtil::toBoolean(estadoDeConexion);
	string localizacion = this->getParametro(keyLocalizacion, keyDefault);
	string password = this->getParametro(keyPassword, keyDefault);
	Usuario* user = this->obtenerUsuario();
	string token = this->getParametro(keyTokenSesion, keyDefault);

	if (user->getId() != keyIdUsuarioNoEncontrado) {
		if (user->getToken() == token) {
			user->setNombre(nombreUsuario);
			user->setEstadoConexion(estado);
			user->setFotoDePerfil(fotoDePerfil);
			user->setLocalizacion(localizacion);
			user->setPassword(password);
			user->persistir();
			Loger::getLoger()->info(
					"Se modificaron los datos del usuario " + user->getNombre()
							+ " correctamente.");
			this->responder(
					"Se modificaron los datos del usuario " + user->getNombre()
							+ " correctamente. Token:" + user->getToken(),
					true);
		} else {
			Loger::getLoger()->warn(
					"El usuario " + user->getNombre()
							+ " no posee un token de session correcto");
			this->responder(
					"El usuario " + user->getNombre()
							+ " no posee un token de session correcto", false);
		}

	} else {
		Loger::getLoger()->warn(
				"El usuario " + user->getNombre()
						+ " no se encuentra registrado en el sistema");
		this->responder(
				"El usuario " + user->getNombre()
						+ " no se encuentra registrado en el sistema", false);
	}
	Loger::getLoger()->guardarEstado();
	delete user;

}
/**
 * Devuelve los datos correspondientes al usuario con telefono igual al
 * recibido.
 */
void Servicio::consultarUsuarioOnline() {
	string telefono = this->getParametroIdMetodoGET(urlBaseUsuario);
	Usuario* user = Usuario::obtenerPorTelefono(telefono);

	string renovarToken = this->getParametro(keyRenovarToken, keyDefault);
	bool renovar = StringUtil::toBoolean(renovarToken);

	if (user->getId() != keyIdUsuarioNoEncontrado) {
		user->registrarUltimaConexion();

		Json::Value respuesta;
		respuesta[keyNombre] = user->getNombre();
		respuesta[keyPassword] = user->getPassword();
		if(renovar){
			respuesta[keyTokenSesion] = user->calcularTokenDeSesion();
		}else{
			respuesta[keyTokenSesion] = user->getToken();
		}
		respuesta[keyEstadoDeConexion] = StringUtil::toString(
				user->getEstadoConexion());
		respuesta[keyFotoDePerfil] = user->getFotoDePerfil();
		respuesta["idUsuario"] = user->getId();
		respuesta[keyLocalizacion] = user->getLocalizacion();
		user->persistir();

		this->responder(respuesta.toStyledString(), true);
		Loger::getLoger()->info(
				"Consulta del usuario " + user->getNombre() + " exitosa.");

	} else {
		string msj = "No se pudo obtener el estado del usuario con numero: "
				+ this->getParametro(keyTelefono, keyDefault)
				+ " ya que no se encuentra registrado en el sistema.";

		Loger::getLoger()->warn(msj);
		this->responder(msj, false);
	}

	Loger::getLoger()->guardarEstado();
	delete user;

}
/*
 * Agrega el mensaje que envió el cliente a la conversacion correspondiente y luego la almacena en
 * la Base de Datos.
 *
 */
void Servicio::almacenarListaDifusion() {
	string idEmisor = this->getParametro(keyIdUsuarioEmisor, keyDefault);
	string token = this->getParametro(keyTokenSesion, keyDefault);

	Json::Value contactosTelefonoValue = this->getParametroArray(
	keyContantosTelefono, keyDefault);
	vector<string> contactosTelefono = StringUtil::jsonValueToVector(
			contactosTelefonoValue);

//chequeo que los usuarios existan:
	Usuario *emisor = Usuario::obtenerPorTelefono(idEmisor);

	if (emisor->getId() == keyIdUsuarioNoEncontrado) {
		string msj_warning =
				"No se pudo almacenar la lista de difusion porque el emisor no existe";
		this->responder(msj_warning, false);
		Loger::getLoger()->warn(msj_warning);
		Loger::getLoger()->guardarEstado();
	} else if (emisor->getToken() != token) {
		Loger::getLoger()->warn(
				"El usuario " + emisor->getNombre()
						+ " no posee un token de session correcto");
		this->responder(
				"El usuario " + emisor->getNombre()
						+ " no posee un token de session correcto", false);
	} else {
		//Obtengo el mensaje:
		string cuerpo = this->getParametro(keyCuerpo, keyDefault);
		string fecha = this->getParametro(keyFecha, keyDefault);
		Mensaje* mensaje = new Mensaje(cuerpo, emisor->getId(), fecha);

		//Recorro los contactos del telefono para verificar cuales estan registrados y conectados
		for (unsigned i = 0; i < contactosTelefono.size(); i++) {
			string telefonoActual = contactosTelefono[i];
			Usuario* usuario = Usuario::obtenerPorTelefono(telefonoActual);

			//Envío mensaje a los usuarios que estan registrados y que se encuentran conectados
			if (usuario->getId() != keyIdUsuarioNoEncontrado
					&& usuario->getEstadoConexion()) {
				//almaceno la conversacion (si no existe la creo):
				Conversacion *conversacion = Conversacion::obtener(
						emisor->getId() + "-" + usuario->getId());
				if (conversacion->getId() != keyIdConversacionNoEncontrada) {
					conversacion->agregarMensaje(mensaje);
					conversacion->persistir();
					delete conversacion;
				} else {
					Conversacion *conversacion = Conversacion::obtener(
							usuario->getId() + "-" + emisor->getId());
					if (conversacion->getId()
							!= keyIdConversacionNoEncontrada) {
						conversacion->agregarMensaje(mensaje);
						conversacion->persistir();
						delete conversacion;
					} else {
						vector<Usuario*> usuarios;
						usuarios.push_back(emisor);
						usuarios.push_back(usuario);
						vector<Mensaje*> mensajes;
						mensajes.push_back(mensaje);
						Conversacion *nuevaConversacion = new Conversacion(
								usuarios, mensajes);
						nuevaConversacion->persistir();
						delete nuevaConversacion;
					}
				}
			}
		}

		this->responder("Lista de difusion enviada correctamente", true);
		delete mensaje;
	}
}
/*
 * Agrega el mensaje que envió el cliente a la conversacion correspondiente y luego la almacena en
 * la Base de Datos.
 *
 */
void Servicio::almacenarConversacion() {

	string idEmisor = this->getParametro(keyIdUsuarioEmisor, keyDefault);
	string idReceptor = this->getParametro(keyIdUsuarioReceptor, keyDefault);

	//chequeo que los usuarios existan:
	Usuario *emisor = Usuario::obtenerPorTelefono(idEmisor);
	Usuario *receptor = Usuario::obtenerPorTelefono(idReceptor);

	string token = this->getParametro(keyTokenSesion, keyDefault);

	if (emisor->getId() == keyIdUsuarioNoEncontrado
			|| receptor->getId() == keyIdUsuarioNoEncontrado) {
		string msj_warning = "No se pudo almacenar la conversacion porque: ";
		if (emisor->getId() == keyIdUsuarioNoEncontrado)
			msj_warning.append("el emisor no existe.");
		if (receptor->getId() == keyIdUsuarioNoEncontrado)
			msj_warning.append(" el receptor no existe.");
		this->responder(msj_warning, false);
		Loger::getLoger()->warn(msj_warning);
		Loger::getLoger()->guardarEstado();

	} else {
		if (emisor->getToken() == token) {
			//Obtengo el mensaje:
			string cuerpo = this->getParametro(keyCuerpo, keyDefault);
			string fecha = this->getParametro(keyFecha, keyDefault);
			Mensaje* mensaje = new Mensaje(cuerpo, emisor->getId(), fecha);

			//almaceno la conversacion (si no existe la creo):
			Conversacion *conversacion = Conversacion::obtener(
					emisor->getId() + "-" + receptor->getId());
			if (conversacion->getId() != keyIdConversacionNoEncontrada) {
				conversacion->agregarMensaje(mensaje);
				conversacion->persistir();
				delete conversacion;
			} else {
				Conversacion *conversacion = Conversacion::obtener(
						receptor->getId() + "-" + emisor->getId());
				if (conversacion->getId() != keyIdConversacionNoEncontrada) {
					conversacion->agregarMensaje(mensaje);
					conversacion->persistir();
					delete conversacion;
				} else {
					vector<Usuario*> usuarios;
					usuarios.push_back(emisor);
					usuarios.push_back(receptor);
					vector<Mensaje*> mensajes;
					mensajes.push_back(mensaje);
					Conversacion *nuevaConversacion = new Conversacion(usuarios,
							mensajes);
					nuevaConversacion->persistir();
					delete nuevaConversacion;
				}
			}

			this->responder(mensaje->getId(), true);
			delete mensaje;
		} else {
			string msj = "El usuario " + emisor->getNombre()
					+ " no posee un token de session correcto";
			Loger::getLoger()->warn(msj);
			this->responder(msj, false);
		}
	}

}