// Author: Juan Carlos De Abreu (jcabreur@gmail.com)
//
// This file define some util functions to manipulate the strings.

#ifndef UTIL_STRING_H__
#define UTIL_STRING_H__

#include "cstdio"
#include "string"
#include "stdarg.h"
#include "tchar.h"

#include "../global.h"

namespace std {
// Check the standard text to use.
#ifdef _UNICODE
  typedef wstring tstring;
#else // SBCS -> ASCII
  typedef string tstring;
#endif
};  // std namespace

BEGIN_TEG_NAMESPACE();

// TODO: deberia tener diferentes formas de obtener los datos
// TODO: el idioma en que se muestra deberia ser cargado de un archivo de configuracion..

// TODO: colocar en otro lado la funcion generica...
// TODO: igaul deberia tener unas funciones para converitr de string a entero y otras cosas ...
// TODO: hacer el resto de funciones parecidas solo que para cada tipo de dato general..
inline std::tstring toString(const int& param_) {
	char tmp[20];
	sprintf(tmp, "%d", param_);
	return tmp;
}

inline std::tstring toString(const float& param_) {
	char tmp[20];
	sprintf(tmp, "%.4f", param_);
	return tmp;
}

inline std::tstring toString(const _TCHAR& param_) {
  _TCHAR buffer[2];
  sprintf(buffer, "%c", param_);
  return buffer;
}

inline bool toBool(const std::tstring& param_) {
	return param_ == _T("TRUE") || param_ == _T("true");
}

inline int toInt(const std::tstring& param_) {
	int number; sscanf(param_.c_str(), "%d", &number);
	return number;
}

inline float toFloat(const std::tstring& param_) {
	float number; sscanf(param_.c_str(), "%f", &number);
	return number;
}

// Method get formatted data in a string.
inline std::tstring toString(const _TCHAR* _format, va_list _argList) {
	// Write the formated data to the temporal buffer.
	_TCHAR buffer[32718]; vsprintf(buffer, _format, _argList);
	return buffer;
}

// TODO: tener otra funcion parecida a sprintf ...

// Method to write formatted data to string
inline  int sprintf(std::tstring& dest, const _TCHAR* format, ...) {
	char tmp[1024];
	// Obtain the pointer to the arguments
	va_list args; va_start(args, format);
	
	// write the formated data to the temporal buffer
	const int nCharactersWritten = vsprintf(tmp, format, args);

	// Copy the temporal buffer to the desstring
	dest = tmp;

	return nCharactersWritten;
}

END_TEG_NAMESPACE();

#endif UTIL_STRING_H__
