// Escribe los viajes ordenados por el criterio que se pide en la línea de comandos.
// La tabla une el nombre de cada criterio con su comparador.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "compare.h"

typedef int (*Compare)(const void *, const void *);

typedef struct {
    const char *name;
    Compare compare;
} Criterion;

int main(int argc, char *argv[]) {
    const Criterion criteria[] = {
        {"pasajeros", compare_by_passengers},
        {"tarifa", compare_by_fare_desc},
        {"ruta", compare_by_route_then_passengers},
    };
    int rows = sizeof(criteria) / sizeof(criteria[0]);
    Trip trips[] = {
        {"Chosica", 18, 2.5}, {"Callao", 25, 3.0}, {"Chosica", 22, 2.9},
        {"Ate", 12, 1.8},     {"Callao", 31, 3.5}, {"Ate", 9, 2.1},
    };
    size_t count = sizeof(trips) / sizeof(trips[0]);

    if (argc != 2) {
        printf("uso: %s pasajeros|tarifa|ruta\n", argv[0]);
        return 1;
    }
    Compare chosen = NULL;
    for (int i = 0; i < rows; i++) {
        if (strcmp(criteria[i].name, argv[1]) == 0) {
            chosen = criteria[i].compare;
        }
    }
    if (chosen == NULL) {
        printf("no conozco el criterio %s\n", argv[1]);
        return 1;
    }

    qsort(trips, count, sizeof(trips[0]), chosen);
    for (size_t i = 0; i < count; i++) {
        printf("%-8s %3d %5.2f\n", trips[i].route, trips[i].passengers, trips[i].fare);
    }
    return 0;
}
