#ifndef READING_MACHINE__H
#define READING_MACHINE__H

#include <filesystem>
#include <memory>
#include "Classifier.hpp"
#include "Strategy.hpp"
#include "Dict.hpp"

class ReadingMachine
{
  public :

  static inline const std::string defaultMachineFilename = "machine.rm";
  static inline const std::string defaultModelFilename = "{}.pt";
  static inline const std::string defaultDictFilename = "{}.dict";
  static inline const std::string defaultDictName = "_default_";

  private :

  std::string name;
  std::filesystem::path path;
  std::unique_ptr<Classifier> classifier;
  std::unique_ptr<Strategy> strategy;
  std::map<std::string, Dict> dicts;
  std::set<std::string> predicted;

  private :

  void readFromFile(std::filesystem::path path);

  public :

  ReadingMachine(std::filesystem::path path);
  ReadingMachine(std::filesystem::path path, std::vector<std::filesystem::path> models, std::vector<std::filesystem::path> dicts);
  TransitionSet & getTransitionSet();
  Strategy & getStrategy();
  Dict & getDict(const std::string & state);
  std::map<std::string, Dict> & getDicts();
  Classifier * getClassifier();
  void save() const;
  bool isPredicted(const std::string & columnName) const;
  const std::set<std::string> & getPredicted() const;
  void trainMode(bool isTrainMode);
};

#endif