#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_MARKA 8
#define MAX_TIP_GUME 6

#define MAX_SIZE 30

typedef struct motor_st
{
    char marka[MAX_MARKA];
    double snaga;
    double vreme_po_krugu;
    int procenat_trosenja;
    char tip_gume[MAX_TIP_GUME];
    int broj_stajanja;
} MOTOR;

FILE *safe_fopen(char *, char *, int);
void ucitaj_motore(FILE *, MOTOR *, int *);
void ispisi_potrosnju_guma(FILE *, MOTOR *, int);
void ispisi_rezultate_nakon_trke(FILE *, MOTOR *, int, int);
void ispisi_potrosene_pneumatike(FILE *, MOTOR *, int, char *);

int main(int argc, char **argv)
{
    MOTOR motori[MAX_SIZE];
    int n;

    FILE *ulazna, *izlazna;

    if(argc != 5)
    {
        printf("Primer poziva programa: %s motori.txt statistika.txt 25 Medium\n", argv[0]);
        exit(1);    // EXIT_FAILURE, koja se nalazi u stdlib.h
    }

    ulazna = safe_fopen(argv[1], "r", 2);
    ucitaj_motore(ulazna, motori, &n);
    fclose(ulazna);

    izlazna = safe_fopen(argv[2], "w", 2);
    ispisi_potrosnju_guma(izlazna, motori, n);
    int broj_krugova = atoi(argv[3]);
    ispisi_rezultate_nakon_trke(izlazna, motori, n, broj_krugova);
    ispisi_potrosene_pneumatike(izlazna, motori, n, argv[4]);
    fclose(izlazna);

    return 0;   // EXIT_SUCCESS, koja se nalazi u stdlib.h
}

FILE *safe_fopen(char *naziv, char *rezim, int kod_greske)
{
    FILE *fp = fopen(naziv, rezim);

    if(fp == NULL)
    {
        printf("Greska prilikom otvaranja %s datoteke!\n", naziv);
        exit(kod_greske);
    }

    return fp;
}

void ucitaj_motore(FILE *ulazna, MOTOR *motori, int *pn)
{
    int i = 0;

    while(fscanf(ulazna, "%s %lf %lf %d %s",
        motori[i].marka,
        &motori[i].snaga,
        &motori[i].vreme_po_krugu,
        &motori[i].procenat_trosenja,
        motori[i].tip_gume) != EOF)
    {
        motori[i].broj_stajanja = 0;
        i++;
    }

    *pn = i;
}

void ispisi_potrosnju_guma(FILE *izlazna, MOTOR *motori, int n)
{
    int i;

    fprintf(izlazna, "Sa jednim setom guma motori mogu preci:\n");

    for(i = 0;i < n;i++)
    {
        fprintf(izlazna, "%s moze preci %d krugova.\n", motori[i].marka, 100 / motori[i].procenat_trosenja);
    }

    fprintf(izlazna, "\n");
}

void ispisi_rezultate_nakon_trke(FILE *izlazna, MOTOR *motori, int n, int broj_krugova)
{
    int i;

    fprintf(izlazna, "Rezultati nakon trke:\n\n");
    fprintf(izlazna, "Naziv	Snaga	Vreme_po_krugu	Broj_stajanja\n");

    for(i = 0;i < n;i++)
    {
        motori[i].broj_stajanja = broj_krugova / (100 / motori[i].procenat_trosenja);
        fprintf(izlazna, "%s\t%.1lfks\t\t%.2lfs\t\t\t%d\n",
            motori[i].marka,
            motori[i].snaga * 1.36,
            motori[i].vreme_po_krugu,
            motori[i].broj_stajanja);
    }

    fprintf(izlazna, "\n");  
}

void ispisi_potrosene_pneumatike(FILE *izlazna, MOTOR *motori, int n, char *tip_pneumatika)
{
    int i;
    int broj_pneumatika = 0;

    for(i = 0;i < n;i++)
    {
        if(strcmp(motori[i].tip_gume, tip_pneumatika) == 0)
        {
            broj_pneumatika += motori[i].broj_stajanja * 2;
        }
    }

    fprintf(izlazna, "Ukupno je potroseno %d guma tipa %s.", broj_pneumatika, tip_pneumatika);
}