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


void saveBook() ;
void allBooks(long long, int) ;


void exo3()
{
    short int choix = 1 ;
    int nbLivres = 0, i, resulScan ;
    char temp, temp2 ;
    long long saveSize ;
    FILE* save = NULL ;
    //FILE** pSave = &save ;
    save = fopen("bibli.save", "r") ;

    //BIBLIOTHEQUE INEXISTANTE :
    if (save == NULL)
    {
        fclose (save) ;
        system("CLS") ;
        printf ("     [BIBLIOTHEQUE]\n\n\n"
                "La bibliotheque est actuellement vide, mais vous pouvez y ajouter des ouvrages !\n\n\n"
                "Que souhaitez-vous faire ?\n\n  1. Ajouter un ouvrage\n  0. Quitter\n") ;
        resulScan = scanf ("%hi", &choix) ;
        fflush (stdin) ;
        while ( (resulScan != 1) || (choix < 0) || (choix > 1) )
        {
            printf ("\nERREUR : Entree incorrecte !\nQue souhaitez-vous faire ?\n") ;
            resulScan = scanf ("%hi", &choix) ;
            fflush (stdin) ;
        }

        if (choix)
        {
            saveBook() ;
            nbLivres++ ;
        }

        save = fopen("bibli.save", "r") ;
    }

    //BIBLIOTHEQUE EXISTANTE :
    if (choix)
    {
        //Mesure de la sauvegarde :
        fseek (save, 0, SEEK_END) ;
        saveSize = ftell(save) ;

        //Calcul du nombre de livres dans la bibliothèque :
        fseek (save, 0, 0) ;
        for (i=0 ; i<saveSize ; i++)
        {
            temp = fgetc(save) ;
            if (temp == '\n') { nbLivres++ ; }
        }
        nbLivres = nbLivres/5 ; //Il y a 5 retours à la ligne par livre dans la mémoire

        do
        {
            system("CLS") ;
            printf ("     [BIBLIOTHEQUE]\n\n\n"
                    "Il y a actuellement %d livre(s) dans la bibliotheque !\nQue souhaitez-vous faire ?\n\n"
                    "  1. Ajouter un ouvrage\n  2. Voir la collection\n  0. Quitter\n", nbLivres) ;
            resulScan = scanf ("%hi", &choix) ;
            fflush (stdin) ;
            while ( (resulScan != 1) || (choix < 0) || (choix > 2) )
            {
                printf ("\nERREUR : Entree incorrecte !\nQue souhaitez-vous faire ?\n") ;
                resulScan = scanf ("%hi", &choix) ;
                fflush (stdin) ;
            }

            switch (choix)
            {
                case 1 :
                    fclose(save) ;
                    saveBook() ;
                    nbLivres++ ;
                    break ;
                case 2 :
                    fclose(save) ;
                    allBooks(saveSize, nbLivres) ;
                    break ;
                default :
                    break ;
            }
        } while (choix != 0) ;
    }
}


void saveBook()
{
    int resulScan, scanTemp ;
    float doubleScanTemp ;
    char temp[50] ;
    FILE* save = NULL ;
    save = fopen("bibli.save", "a+") ;

    //Saisie du titre du livre :
    printf ("\n\n  Titre : ") ;
    fgets (temp, 50, stdin) ;
    fputs (temp, save) ;

    //Saisie du nom de l'auteur :
    printf ("\n  Auteur : ") ;
    fgets (temp, 50, stdin) ;
    fputs (temp, save) ;

    //Saisie de la date de parution du livre :
    printf ("\n  Date de parution : ") ;
    resulScan = scanf ("%d", &scanTemp) ;
    fflush (stdin) ;
    while (resulScan != 1)
    {
        printf ("\nERREUR : Format incorrect !\n  Date : ") ;
        resulScan = scanf ("%d", &scanTemp) ;
        fflush (stdin) ;
    }
    fprintf (save, "%d\n", scanTemp) ;

    //Saisie du prix du livre :
    printf ("\n  Prix : ") ;
    resulScan = scanf ("%f", &doubleScanTemp) ;
    fflush (stdin) ;
    while ( (resulScan != 1) || (doubleScanTemp < 0) )
    {
        printf ("\nERREUR : Entree incorrecte !\n  Prix : ") ;
        resulScan = scanf ("%f", &doubleScanTemp) ;
        fflush (stdin) ;
    }
    fprintf (save, "%.2f\n\n", doubleScanTemp) ; //double retour à la ligne pour marquer la frontière avec les prochains livres enregistrés

    fclose (save) ;
}


void allBooks(long long saveSize, int nbLivres)
{
    int i, resulScan, choix, ligneActuelle = 0 ;
    char curseur, info ;
    FILE* save = NULL ;
    save = fopen("bibli.save", "r") ;

    if (save == NULL)
    {
        printf ("\n\nERREUR : Bibliotheque inaccessible !\n") ;
        system("PAUSE") ;
    }
    else
    {
        printf("\n\n\nListe des ouvrages actuellement dans la bibliotheque :\n") ;

        for (i=0 ; i<nbLivres ; i++)
        {
            //On écrit l'indice du livre :
            printf("\n%d. ", i+1) ;

            //On écrit un titre :
            curseur = fgetc(save) ;
            while (curseur != '\n')
            {
                printf ("%c", curseur) ;
                curseur = fgetc(save) ;
            }

            //On passe les lignes jusqu'au titre suivant :
            ligneActuelle++ ;
            while (ligneActuelle % 5 != 0) //Un titre est écrit en mémoire toutes les 5 lignes
            {
                curseur = fgetc(save) ;
                if (curseur == '\n') { ligneActuelle++ ; }
            }
        }

        //Informations sur les livres :
        do
        {
            printf ("\n\n\nSouhaitez-vous connaitre les details d'un ouvrage en particulier ? (o/n)\n") ;
            resulScan = scanf ("%c", &info) ;
            fflush (stdin) ;
            while ( (resulScan != 1) || ((info != 'o') && (info != 'n')) )
            {
                printf ("\nERREUR : Entree incorrecte !\nSouhaitez-vous connaitre les details d'un ouvrage en particulier ? (o/n)\n") ;
                resulScan = scanf ("%c", &info) ;
                fflush (stdin) ;
            }

            if (info == 'o')
            {
                printf ("\n\n  Choisissez un livre : ") ;
                resulScan = scanf ("%d", &choix) ;
                fflush (stdin) ;
                while ( (resulScan != 1) || (choix < 1) || (choix > nbLivres) )
                {
                    printf ("\nERREUR : Entree incorrecte !\nChoisissez le numero d'un livre parmi la liste precedente :\n") ;
                    resulScan = scanf ("%d", &choix) ;
                    fflush (stdin) ;
                }

                //Remise du curseur au début du fichier :
                fseek (save, 0, 0) ;
                ligneActuelle = 0 ;

                //On avance jusqu'à la ligne souhaitée :
                while (ligneActuelle != (5*(choix-1)))
                {
                    curseur = fgetc(save) ;
                    if (curseur == '\n') { ligneActuelle++ ; }
                }
                //On affiche les éléments :
                printf ("\n\n\nTitre --> ") ;
                curseur = fgetc(save) ;
                while (curseur != '\n')
                {
                    printf ("%c", curseur) ;
                    curseur = fgetc(save) ;
                }
                printf ("\nAuteur --> ") ;
                curseur = fgetc(save) ;
                while (curseur != '\n')
                {
                    printf ("%c", curseur) ;
                    curseur = fgetc(save) ;
                }
                printf ("\nDate de parution --> ") ;
                curseur = fgetc(save) ;
                while (curseur != '\n')
                {
                    printf ("%c", curseur) ;
                    curseur = fgetc(save) ;
                }
                printf ("\nPrix indicatif --> ") ;
                curseur = fgetc(save) ;
                while (curseur != '\n')
                {
                    printf ("%c", curseur) ;
                    curseur = fgetc(save) ;
                }
            }
        } while (info == 'o') ;
    }
}
