#pragma once

#include "finder.h"
#include "word_list.h"

#include <map>

class SearchTreeNode {
private:
  std::forward_list<const std::string *> words_;
  std::map<const char, SearchTreeNode> children_;

public:
  void insert(std::string_view partial_word, const std::string *original_word);
  const SearchTreeNode *find(std::string_view search_term) const;

  std::forward_list<const std::string *> words() const;
};

class SearchTree : public SearchTreeNode {
public:
  SearchTree(const WordList &word_list);
};

class TreeFinder : public Finder {
private:
  SearchTree search_tree_;

public:
  TreeFinder(const WordList &word_list);

  virtual std::forward_list<const std::string *>
  find_prefix(std::string_view search_term) const override;
};
