//***********************************
//*              Mp3                *
//*        Mini-Datenbank           *
//*   Array aus Strukturvariablen   *
//*         Franz Kohnle            *
//*           16.3.2007             *
//***********************************

#include "stdio.h"
#define ANZAHL 10

// Datentyp definieren
struct Mp3{
    char Interpret[21];
    char Titel[21];
    int Laenge; // in Sekunden
    double Groesse; // in MB
};

// Prototypen
void TabelleLeeren(struct Mp3* pTabelle);
void Ueberschrift();
void TrackAusgeben(struct Mp3* pTabelle, int index);
void TabelleAusgeben(struct Mp3* pTabelle);
char Menue();
char SubMenue();

//=======================
// Hauptfunktion
//=======================
int main(){
    // Speicher fuer Tabelle deklarieren
    struct Mp3 track[ANZAHL];

    // sonstige Variablen
    char Taste;
    int ende=0;
    int Nummer;
    int Minuten, Sekunden;
    char Dateipfad[80];
    FILE* pDatei;

    // Tabelle mit Anfangswerten fuellen
    TabelleLeeren(track);

    do{
        // Ueberschrift ausgeben
        Ueberschrift();

        // Tabelle ausgeben
        TabelleAusgeben(track);

        // Menue ausgeben
        Taste=Menue();

        // Auswahlverzweigung
        switch(Taste){
            case 'a': // Daten aendern
                // Nummer einlesen
                do{
                    Ueberschrift();
                    TabelleAusgeben(track);
                    // Index einlesen
                    printf("\n\tWelchen Track moechten Sie aendern (1-%d)? ",ANZAHL);
                    scanf("%d",&Nummer);
                    fflush(stdin);
                }while(Nummer<1 || Nummer>ANZAHL);
                // Submenue ausgeben
                Ueberschrift();
                TrackAusgeben(track,Nummer-1);
                Taste=SubMenue();
                switch(Taste){
                    case 'a': // Interpret aendern
                        Ueberschrift();
                        TrackAusgeben(track,Nummer-1);
                        printf("\n\tNeuer Interpret: ");
                        gets(track[Nummer-1].Interpret);
                        break;
                    case 'b': // Titel aendern
                        Ueberschrift();
                        TrackAusgeben(track,Nummer-1);
                        printf("\n\tNeuer Titel: ");
                        gets(track[Nummer-1].Titel);
                        break;
                    case 'c': // Laenge aendern
                        Ueberschrift();
                        TrackAusgeben(track,Nummer-1);
                        printf("\n\tNeue Laenge: ");
                        printf("\n\tMinuten: ");
                        scanf("%d",&Minuten);
                        printf("\tSekunden: ");
                        scanf("%d",&Sekunden);
                        track[Nummer-1].Laenge=60*Minuten+Sekunden;
                        break;
                    case 'd': // Groesse aendern
                        Ueberschrift();
                        TrackAusgeben(track,Nummer-1);
                        printf("\n\tNeue Groesse in MB: ");
                        scanf("%lf",&track[Nummer-1].Groesse);
                        break;
                    case 'e': // Nichts aendern
                        break;
                }
                break;
            case 'b': // Datei speichern
                Ueberschrift();
                // Pfad einlesen
                printf("\n\tBitte Dateipfad eingeben: ");
                gets(Dateipfad);
                // in Datei speichern
                pDatei = fopen(Dateipfad,"w");
                if(pDatei!=NULL){
                    // Datei ist geoeffnet
                    fwrite(track,sizeof(struct Mp3),ANZAHL,pDatei);
                    fclose(pDatei);
                    printf("\n\tDie Daten sind in der Datei %s gespeichert.",
                           Dateipfad);
                }
                else{
                    // FEHLER
                    printf("\n\tDie Datei %s konnte nicht erstellt werden.",
                            Dateipfad);
                }

                printf("\n\n\t\tBitte beliebige Taste druecken.\n");
                getch();
                break;
            case 'c':// Datei laden
                Ueberschrift();
                // Pfad einlesen
                printf("\n\tBitte Pfad und Name der zu oeffnenden Datei eingeben: ");
                gets(Dateipfad);
                // von Datei laden
                pDatei = fopen(Dateipfad,"r");
                if(pDatei!=NULL){
                    // Datei ist geoeffnet
                    fread(track,sizeof(struct Mp3),ANZAHL,pDatei);
                    fclose(pDatei);
                    printf("\n\tDie Datei %s wurde geladen.", Dateipfad);
                }
                else{
                    // FEHLER
                    printf("\n\tDie Datei %s konnte nicht geoeffnet werden.",
                            Dateipfad);
                }
                 printf("\n\n\t\tBitte beliebige Taste druecken.\n");
                getch();
                break;
            case 'd': // Programm beenden
                Ueberschrift();
                printf("\n\n\n\t\t\tAuf Wiedersehen!");
                getch();
                ende=1;
                break;
        }
    }while(!ende);
    return 0;
}

//=======================
// Funktionsdefinitionen
//=======================
void TabelleLeeren(struct Mp3* pTabelle){
    // Tabelle mit Anfangswerten fuellen
    int i;
    for(i=0; i<ANZAHL; i++){
        strcpy(pTabelle[i].Interpret,"---");
        strcpy(pTabelle[i].Titel,"---");
        pTabelle[i].Laenge=0;
        pTabelle[i].Groesse=0;
    }
}

void Ueberschrift(){
    // Ueberschrift ausgeben
    system("cls");
    printf("\t\t\t**********************\n");
    printf("\t\t\t*    mp3-Datenbank   *\n");
    printf("\t\t\t**********************\n\n\n");
}

void TrackAusgeben(struct Mp3* pTabelle, int index){
    printf("\t%d. %s - %s, %d:%0.2d min, %0.1lf MB\n",
            index+1,
            pTabelle[index].Interpret,
            pTabelle[index].Titel,
            pTabelle[index].Laenge/60,
            pTabelle[index].Laenge%60,
            pTabelle[index].Groesse);
}

void TabelleAusgeben(struct Mp3* pTabelle){
    int i;
    for(i=0; i<ANZAHL; i++){
        printf("\t%d. %s - %s, %d:%0.2d min, %0.1lf MB\n",
            i+1,
            pTabelle[i].Interpret,
            pTabelle[i].Titel,
            pTabelle[i].Laenge/60,
            pTabelle[i].Laenge%60,
            pTabelle[i].Groesse);
    }
}

char Menue(){
    // Menue ausgeben
    char Taste;
    printf("\n\t(a) Daten aendern\n");
    printf("\t(b) Datei speichern\n");
    printf("\t(c) Datei laden\n");
    printf("\t(d) Programm beenden\n");
    printf("\n\tBitte entsprechende Taste druecken. ");
    do{
        Taste=getch();
    }while(Taste!='a' && Taste!='b' && Taste!='c' && Taste!='d');
    return Taste;
}

char SubMenue(){
    // Menue ausgeben
    char Taste;
    printf("\n\t(a) Interpret aendern\n");
    printf("\t(b) Titel aendern\n");
    printf("\t(c) Laenge aendern\n");
    printf("\t(d) Groesse aendern\n");
    printf("\t(e) Alle Werte beibehalten\n");
    printf("\tBitte entsprechende Taste druecken. ");
    do{
        Taste=getch();
    }while(Taste!='a' && Taste!='b' && Taste!='c' && Taste!='d' && Taste!='e');
    return Taste;
}

