// Una tabla leída de un archivo CSV: la primera línea tiene los nombres de las columnas,
// y cada celda es un Value. El tipo es opaco: los campos solo los conoce table.c.
#ifndef TABLE_H
#define TABLE_H

#include "value.h"

#define TABLE_MAX_COLUMNS 8

typedef struct table Table;

// Lee el archivo y devuelve la tabla, o NULL si no se puede abrir, si no tiene encabezado,
// si alguna fila no tiene tantos campos como columnas o si no hay memoria.
// Quien llama es owner de la tabla y la libera con table_free.
Table *table_load(const char *name);

// Libera la tabla y todo lo que posee, también las cadenas de sus celdas. Acepta NULL.
void table_free(Table *t);

int table_rows(const Table *t);
int table_columns(const Table *t);
const char *table_column_name(const Table *t, int column);

// Devuelve la celda, sin copiarla. La sigue poseyendo la tabla: quien llama no la libera.
const Value *table_cell(const Table *t, int row, int column);

// Lo que resume una columna. La suma, el mínimo y el máximo miran los enteros y los decimales.
// Si la columna no tiene números, sum, min y max valen 0.
typedef struct {
    int integers;
    int decimals;
    int strings;
    int nones;
    double sum;
    double min;
    double max;
} ColumnSummary;

ColumnSummary table_summary(const Table *t, int column);

#endif
