

#include "tfiletype.h"
#include "tfilepath.h"
#include <QString>

namespace {

class FileTypeData {
public:
  std::map<std::string, int> m_table;

public:
  FileTypeData() {
    // Base, hard-coded known file types
    m_table["tnz"] = TFileType::TOONZSCENE;
    m_table["tab"] = TFileType::TABSCENE;
  }

  static FileTypeData *instance() {
    static FileTypeData data;
    return &data;
  }
};

}  // namespace

//================================================================================

TFileType::Type TFileType::getInfo(const TFilePath &fp) {
  FileTypeData *data = FileTypeData::instance();
  std::map<std::string, int>::iterator it = data->m_table.find(fp.getType());

  int type = (it == data->m_table.end()) ? TFileType::UNKNOW_FILE : it->second;
  if ((type & TFileType::LEVEL) == 0 && (fp.getDots() == ".."))
    type |= TFileType::LEVEL;

  return (TFileType::Type)type;
}

//--------------------------------------------------------------------------------

TFileType::Type TFileType::getInfoFromExtension(const std::string &extension) {
  std::string extLower = extension;
  std::transform(extLower.begin(), extLower.end(), extLower.begin(), ::tolower);
  FileTypeData *data = FileTypeData::instance();
  std::map<std::string, int>::iterator it = data->m_table.find(extLower);
  int type = (it == data->m_table.end()) ? TFileType::UNKNOW_FILE : it->second;
  return (TFileType::Type)type;
}

TFileType::Type TFileType::getInfoFromExtension(const QString &type) {
  return getInfoFromExtension(type.toStdString());
}

//--------------------------------------------------------------------------------

void TFileType::declare(std::string extension, Type type) {
  FileTypeData *data       = FileTypeData::instance();
  data->m_table[extension] = type;
}
