#ifndef _CFG_WFST_COMPOSER_H_
#define _CFG_WFST_COMPOSER_H_

#include <iostream>
#include <vector>
#include <utility>

#include "trule.h"
#include "wordid.h"

class CFG_WFSTComposerImpl;
class Hypergraph;

struct WFSTNode {
  virtual ~WFSTNode();
  // returns the next states reachable by consuming srcindex (which identifies a word)
  // paired with the output string generated by taking that transition.
  virtual std::vector<std::pair<const WFSTNode*,TRulePtr> > ExtendInput(unsigned srcindex) const = 0;
};

struct WFST {
  virtual ~WFST();
  virtual const WFSTNode* Final() const = 0;
  virtual const WFSTNode* Initial() const = 0;
};

class CFG_WFSTComposer {
 public:
  ~CFG_WFSTComposer();
  explicit CFG_WFSTComposer(const WFST& wfst);
  bool Compose(const Hypergraph& in_forest, Hypergraph* trg_forest);

  // reads the grammar from a file. There must be a single top-level
  // S -> X rule.  Anything else is possible. Format is:
  // [S] ||| [SS,1]
  // [SS] ||| [NP,1] [VP,2] ||| Feature1=0.2 Feature2=-2.3
  // [SS] ||| [VP,1] [NP,2] ||| Feature1=0.8
  // [NP] ||| [DET,1] [N,2] ||| Feature3=2
  // ...
  bool Compose(std::istream* grammar_file, Hypergraph* trg_forest);

 private:
  CFG_WFSTComposerImpl* pimpl_;
};

#endif