/*
 *        File: sol-m7u4es9.c
 *
 *        Data: 04/10/2016
 *
 * Descrizione: Scrivi un programma che permette di inserire un certo numero di
 *              offerte di fornitori e che contenga i seguenti dati:
 *                - codice fornitore (numero intero);
 *                - ragione sociale e/o nome fornitore (stringa);
 *                - indirizzo completo;
 *                - partita IVA e/o codice fiscale;
 *                - importo offerta in Euro (numero float);
 *                - data offerta e validita'
 *
 *               Quando l'utente inserisce 0 come codice fornitore, l'inserimento
 *               ha termine. Il programma cerca e visualizza l'offerta migliore
 *               (la piu' economica).
 */


#include <stdio.h>

#define MAX_RAG_SOCIALE 15
#define MAX_INDIRIZZO 20
#define MAX_P_IVA 15

#define MAX_TABELLA 10

struct data {
    int giorno;
    int mese;
    int anno;
};

struct offerta {
    int cod_forn;
    char rag_sociale[MAX_RAG_SOCIALE + 1];
    char indirizzo[MAX_INDIRIZZO + 1];
    char p_iva[MAX_P_IVA + 1];
    float importo;
    struct data data_offerta;
    int validita; // Espressa in giorni
};

int inserisci_offerta(struct offerta vett[], int dim) {
    // Inserimento da tastiera di una nuova offerta in coda alla tabella.
    //
    // Restituisce la nuova dimensione di tabella nel caso di inserimento
    // effettuato con successo.
    // Restituisce -1 se nessun inserimento e' stato effettuato (per esempio,
    // perche' l'utente ha digitato un codice fornitore pari a 0 oppure
    // perche' la tabella e' piena).
    
    int cod;
    
    if (dim == MAX_TABELLA)
        // Nessun inserimento poiche' la tabella e' piena (la dimensione logica
        // della tabella e' pari a quella fisica). Si restituisce -1
        return -1;
        
    do {
        printf("\nCodice fornitore (0 per terminare): ");
        scanf("%d", &cod);
        
        if (cod < 0) printf("Codice errato.\n");
        
    } while (cod < 0);
    
    if (cod == 0)
        // Nessun inserimento, si restituisce -1.
        return -1;
        
    // Inserimento dei dettagli dell'offerta (validazioni omesse per semplicita').
    
    vett[dim].cod_forn = cod;

    fflush(stdin);
    printf("Ragione sociale e/o nome fornitore: ");
    gets(vett[dim].rag_sociale);
    
    fflush(stdin);
    printf("Indirizzo: ");
    gets(vett[dim].indirizzo);

    fflush(stdin);
    printf("Partita IVA e/o codice fiscale: ");
    gets(vett[dim].p_iva);

    fflush(stdin);
    printf("Importo [EUR]: ");
    scanf("%f", &vett[dim].importo);

    printf("Data dell'offerta (gg mm aaaa): ");
    scanf("%d%d%d",
        &vett[dim].data_offerta.giorno,
        &vett[dim].data_offerta.mese,
        &vett[dim].data_offerta.anno
    );
    
    printf("Validita' dell'offerta (in giorni): ");
    scanf("%d", &vett[dim].validita);
    
    return dim + 1;
}

int ricerca_offerta_min(struct offerta vett[], int dim) {
    // Restituisce l'indice dell'offerta di importo minimo, oppure
    // il valore -1 nel caso in cui non sia possibile determinare il valore
    // minimo (tabella vuota).

    int i_min = -1;
    
    for (int i = 0; i < dim; i++)
        if (i_min == -1 || vett[i].importo < vett[i_min].importo)
            i_min = i;

    return i_min;
}

void stampa_offerta(struct offerta vett[], int i_offerta) {

    // Stampa i dettagli della sola offerta di posizione "i_offerta"
    
    if (i_offerta < 0) {
        printf("Offerta inesistente.\n");
        return;
    }
    
    printf(" Cod. fornitore: %d\n", vett[i_offerta].cod_forn);
    printf("Ragione sociale: %s\n", vett[i_offerta].rag_sociale);
    printf(" Indirizzo: %s\n", vett[i_offerta].indirizzo);
    printf(" Partita IVA: %s\n", vett[i_offerta].p_iva);
    printf(" Importo: %.2f EUR\n", vett[i_offerta].importo);
    printf(" Data offerta: %02d/%02d/%04d\n",
        vett[i_offerta].data_offerta.giorno,
        vett[i_offerta].data_offerta.mese,
        vett[i_offerta].data_offerta.anno);
    printf(" Validita': %d giorni\n", vett[i_offerta].validita);
}

int main( void ) {

    struct offerta tabella[MAX_TABELLA];
    int dim_tabella = 0; // Tabella inizialmente vuota (dim. logica = 0)

    int nuova_dim;
    int indice_min;
    
    do {
        nuova_dim = inserisci_offerta(tabella, dim_tabella);
        if (nuova_dim != -1)
            dim_tabella = nuova_dim;
    }
    while (nuova_dim != -1);
    
    indice_min = ricerca_offerta_min(tabella, dim_tabella);

    printf("\n\nOfferta piu' vantaggiosa:\n\n");
    stampa_offerta(tabella, indice_min);

    return 0;
}