/*
-----BEGIN QCMOD-----
name: libboost
arg: with-libboost-inc=[path], Path to libboost include files
arg: with-libboost-lib=[path], Path to libboost library files
-----END QCMOD-----
*/
#include <boost/version.hpp>
class qc_libboost : public ConfObj
{
public:
	qc_libboost(Conf *c) : ConfObj(c) {}
	QString name() const { return "libboost"; }
	QString shortname() const { return "libboost"; }
  QString findBoostLib(QString path, QString lib) const {
    QString name;
    QDir libDir(path);
    QStringList filters;
    filters << "libboost_"+lib+"*-mt*.so";
    QStringList result = libDir.entryList(filters, QDir::Files);
    if(!result.empty()) {
      name = result.first().mid(3);
      // Remove .so
      name.chop(3);
    } else {
      // Fall back to non -mt boost lib
      filters.clear();
      filters << "libboost_"+lib+"*.so";
      result = libDir.entryList(filters, QDir::Files);
      if(!result.empty()) {
        name = result.first().mid(3);
        // Remove .so
        name.chop(3);
      }
    }
    return name;
  }
	bool exec(){
        	QString s;
		s = conf->getenv("QC_WITH_LIBBOOST_INC");
		if(!s.isEmpty()) {
			if(!conf->checkHeader(s, "boost/format.hpp")) {
				return false;
      			}
			if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
				return false;
      			}
			if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
				return false;
      			}
			if(!conf->checkHeader(s, "boost/thread.hpp")) {
				return false;
      			}
		}else{
			QStringList sl;
			sl << "/usr/include";
			sl << "/usr/local/include";
			bool found = false;
			foreach(s, sl){
				if(conf->checkHeader(s, "boost/format.hpp")){
					found = true;
					break;
				}
			}
			if(!found) {
				return false;
          		}
			if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
				return false;
      			}
			if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
				return false;
      			}
			if(!conf->checkHeader(s, "boost/thread.hpp")) {
				return false;
      			}
		}
		conf->addIncludePath(s);
		// Find library
		s = conf->getenv("QC_WITH_LIBBOOST_LIB");
    QStringList required_libs;
#if BOOST_VERSION >= 103500
      required_libs << "system"; 
#endif
    if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
      // Not required by nox
      required_libs << "filesystem" << "thread";
    }
    QStringList libDirs;
    libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
    foreach(const QString& lib, required_libs) {
      if(!s.isEmpty()) {
        QString detected_name = findBoostLib(s, lib);
        if(detected_name.isEmpty()) {
          printf("Could not find boost %s library!\n", qPrintable(lib));
          return false;
        } else {
          conf->addLib("-l"+detected_name);
        }
      } else {
        bool found = false;
        foreach(const QString& libDir, libDirs) {
          QString detected_name = findBoostLib(libDir, lib);
          if(!detected_name.isEmpty()) {
            conf->addLib("-l"+detected_name);
            found = true;
            break;
          }
        }
        if(!found) {
          printf("Could not find boost %s library!\n", qPrintable(lib));
          return false;
        }
      }
    }
		return true;
	}
};
