// Tres reglas para ordenar tareas, contra la fuerza bruta.
#include <iostream>
#include <string>
#include <vector>

#include "scheduling.h"

namespace {

std::string names(const std::vector<int>& order) {
    std::string text;
    for (int id : order) {
        text += static_cast<char>('A' + id);
    }
    return text;
}

void compare(const std::string& title, const std::vector<Job>& jobs) {
    std::cout << title << "\n  tareas (duración, plazo):";
    for (std::size_t i = 0; i < jobs.size(); i++) {
        std::cout << ' ' << static_cast<char>('A' + static_cast<int>(i)) << '(' << jobs[i].duration << ", "
                  << jobs[i].deadline << ')';
    }
    std::cout << "\n  óptimo por fuerza bruta: " << brute_min_max_lateness(jobs) << '\n';
    std::vector<int> by_duration = order_by_duration(jobs);
    std::vector<int> by_slack = order_by_slack(jobs);
    std::vector<int> by_deadline = order_by_deadline(jobs);
    std::cout << "  dura menos   : " << max_lateness(jobs, by_duration) << "  orden " << names(by_duration) << '\n';
    std::cout << "  menos holgura: " << max_lateness(jobs, by_slack) << "  orden " << names(by_slack) << '\n';
    std::cout << "  plazo antes  : " << max_lateness(jobs, by_deadline) << "  orden " << names(by_deadline) << '\n';
}

}  // namespace

int main() {
    compare("Contra dura menos:", {{1, 100}, {10, 10}});
    compare("Contra menos holgura:", {{1, 2}, {10, 10}});
}
