// Ideas para armar un código, contra la búsqueda exhaustiva, y el efecto de los empates.
#include <iostream>
#include <string>
#include <vector>

#include "huffman.h"

namespace {

void print_list(const std::vector<int>& values) {
    for (int value : values) std::cout << ' ' << value;
}

void compare(const std::vector<long long>& freq) {
    std::cout << "frecuencias:";
    for (long long value : freq) std::cout << ' ' << value;
    std::vector<int> split = top_down_split(freq);
    std::vector<int> chain = chain_code(freq);
    HuffmanResult result = huffman(freq);
    std::cout << "\n  mejor árbol, por búsqueda exhaustiva: " << brute_min_cost(freq);
    std::cout << "\n  dividir parejo: " << code_cost(freq, split) << "  profundidades";
    print_list(split);
    std::cout << "\n  en cadena     : " << code_cost(freq, chain) << "  profundidades";
    print_list(chain);
    std::cout << "\n  Huffman       : " << code_cost(freq, result.depth) << "  profundidades";
    print_list(result.depth);
    std::cout << '\n';
}

void ties(const std::vector<long long>& freq) {
    std::cout << "frecuencias:";
    for (long long value : freq) std::cout << ' ' << value;
    std::cout << '\n';
    for (const std::vector<int>& depth : huffman_all_ties(freq)) {
        std::cout << "  profundidades";
        print_list(depth);
        std::cout << "  costo " << code_cost(freq, depth) << '\n';
    }
}

}  // namespace

int main() {
    compare({15, 7, 6, 6, 5});
    compare({1, 1, 1, 1, 1, 1, 1, 1});
    std::cout << "\nTodas las formas de romper los empates:\n";
    ties({1, 1, 2, 2});
    ties({1, 1, 2, 3, 5, 8});
}
