#pragma once

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

#include <unordered_map>

class SearchTreeNode {
private:
  WordRefList words_;
  std::unordered_map<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;

  WordRefList 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);

  WordRefList find_prefix(std::string_view search_term) const override;
};
