// Ventas de un puesto del mercado: lee ventas.txt y escribe una tabla y un resumen.
// Todo está en un solo archivo. La sesión 1 lo divide en módulos.
#include <stdio.h>

#define MAX_SALES 100
#define NAME_SIZE 20
#define LINE_SIZE 100
#define CENTS_PER_SOL 100

struct sale {
    char product[NAME_SIZE];
    int quantity;
    int unit_cents;
};

// Parte una línea "producto cantidad precio". Devuelve 1 si tiene esa forma y 0 si no.
int parse_line(const char *line, struct sale *sale) {
    char extra[2];
    int fields = sscanf(line, "%19s %d %d %1s", sale->product, &sale->quantity,
                        &sale->unit_cents, extra);
    return fields == 3 && sale->quantity > 0 && sale->unit_cents >= 0;
}

// Lee hasta max_sales ventas. Devuelve cuántas leyó, o -1 si el archivo no se puede abrir,
// si una línea está mal o si hay más ventas que max_sales.
int load_sales(const char *name, struct sale sales[], int max_sales) {
    FILE *file = fopen(name, "r");
    if (file == NULL) {
        return -1;
    }

    char line[LINE_SIZE];
    int n = 0;
    while (fgets(line, LINE_SIZE, file) != NULL) {
        if (n == max_sales || !parse_line(line, &sales[n])) {
            fclose(file);
            return -1;
        }
        n++;
    }
    fclose(file);
    return n;
}

// Devuelve lo que se cobró en una venta, en céntimos.
int sale_total(const struct sale *sale) {
    return sale->quantity * sale->unit_cents;
}

// Devuelve lo que se cobró en n ventas, en céntimos.
int sales_total(const struct sale sales[], int n) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        total += sale_total(&sales[i]);
    }
    return total;
}

// Devuelve el índice de la venta que más cobró, o -1 si n es 0.
int best_sale(const struct sale sales[], int n) {
    if (n == 0) {
        return -1;
    }

    int best = 0;
    for (int i = 1; i < n; i++) {
        if (sale_total(&sales[i]) > sale_total(&sales[best])) {
            best = i;
        }
    }
    return best;
}

// Escribe un monto en la forma S/ 12.50, sin salto de línea.
void print_money(int cents) {
    printf("S/ %d.%02d", cents / CENTS_PER_SOL, cents % CENTS_PER_SOL);
}

// Escribe una línea por venta.
void print_table(const struct sale sales[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%-10s %3d  ", sales[i].product, sales[i].quantity);
        print_money(sale_total(&sales[i]));
        printf("\n");
    }
}

// Escribe el total y la venta que más cobró.
void print_summary(const struct sale sales[], int n) {
    printf("Total: ");
    print_money(sales_total(sales, n));
    printf("\n");

    int best = best_sale(sales, n);
    if (best >= 0) {
        printf("La mejor venta: %s\n", sales[best].product);
    }
}

int main(void) {
    struct sale sales[MAX_SALES];
    int n = load_sales("ventas.txt", sales, MAX_SALES);
    if (n < 0) {
        fprintf(stderr, "No se pudo leer ventas.txt\n");
        return 1;
    }

    print_table(sales, n);
    print_summary(sales, n);
    return 0;
}
