// Corrector ortográfico: revisa palabras y propone las que están a un cambio de distancia.
// Trabajen con letras (split_letters, en utf8.h), nunca con bytes: "á" ocupa dos.
#ifndef SPELL_CHECKER_H
#define SPELL_CHECKER_H

#include <algorithm>
#include <cstddef>
#include <string>
#include <unordered_map>
#include <vector>

#include "not_implemented.h"
#include "utf8.h"

struct Misspelling {
    std::string word;
    std::size_t count;                     // cuántas veces aparece en el texto
    std::vector<std::string> suggestions;  // en orden de bytes, sin repetir
};

// Todas las palabras a un cambio de distancia de `word`, con repeticiones permitidas. Un cambio es
// una de estas tres cosas, y no otra (intercambiar dos letras vecinas son dos cambios):
//   - borrar una letra;
//   - reemplazar una letra por otra de alphabet();
//   - insertar una letra de alphabet() en cualquier posición, incluidos el inicio y el final.
inline std::vector<std::string> one_edit_candidates(const std::string& word) {
    (void)word;
    not_implemented("one_edit_candidates");
}

// Los candidatos que están en el diccionario, ordenados y sin repetir, sin la cadena vacía.
// Dict es cualquier tipo con contains(word).
template <typename Dict>
std::vector<std::string> suggest(const Dict& dict, const std::string& word) {
    (void)dict;
    (void)word;
    not_implemented("suggest");
}

// Un Misspelling por cada palabra distinta que no está en el diccionario, en el orden en que
// aparecen por primera vez. Calculen las sugerencias de cada palabra una sola vez: una palabra
// desconocida puede repetirse miles de veces.
template <typename Dict>
std::vector<Misspelling> check_words(const Dict& dict, const std::vector<std::string>& words) {
    (void)dict;
    (void)words;
    not_implemented("check_words");
}

#endif
