// Sesión 2: autocompletado sobre el archivo de términos.
// Los templates sobre Terms aceptan cualquier contenedor con size() y operator[]: las
// pruebas cuentan cuántos términos leen. Por eso recorran con índices, no con iteradores.
#ifndef AUTOCOMPLETE_H
#define AUTOCOMPLETE_H

#include <cstddef>
#include <string>
#include <vector>

#include "not_implemented.h"
#include "sorts.h"
#include "terms_io.h"

// Los términos cuyos bytes empiezan con el prefijo son terms[first, last).
struct Range {
    std::size_t first;
    std::size_t last;
};

// Ordena por el texto, comparando bytes como lo hace std::string, con su merge_sort.
inline void sort_by_text(std::vector<Term>& terms) {
    (void)terms;
    not_implemented("sort_by_text");
}

// terms está ordenado por texto. Devuelve el rango de los términos que empiezan con prefix
// usando dos búsquedas binarias. El prefijo vacío da todo el arreglo. Si ninguno empieza
// así, first == last, y los dos señalan dónde estaría el prefijo.
//
// "Empezar con" se refiere a bytes: "ca" no incluye a "cámara", cuyo segundo byte no es 'a'.
template <typename Terms>
Range prefix_range(const Terms& terms, const std::string& prefix) {
    (void)terms;
    (void)prefix;
    not_implemented("prefix_range");
}

// Los k términos de terms[range.first, range.last) con mayor peso, de mayor a menor.
// Los empates van por texto, de menor a mayor. Si hay menos de k, devuelve los que haya.
// Solo puede leer los términos del rango. Piensen en qué ordenamiento les conviene.
template <typename Terms>
std::vector<Term> top_k(const Terms& terms, Range range, std::size_t k) {
    (void)terms;
    (void)range;
    (void)k;
    not_implemented("top_k");
}

// Lo mismo sin búsqueda binaria: revisa todos los términos en cada consulta, sin cortar
// antes de tiempo, y usa std::string::starts_with. Es la línea de base contra la que se
// mide, y las pruebas la usan como oráculo.
template <typename Terms>
std::vector<Term> top_k_scan(const Terms& terms, const std::string& prefix, std::size_t k) {
    (void)terms;
    (void)prefix;
    (void)k;
    not_implemented("top_k_scan");
}

#endif
