/***************************************************************************
 *   Copyright (C) 2005 by Christian Bucher                                *
 *   christian.bucher@amadyne.net                                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
 
#ifdef LINUX
  // Unter Linux muss meist noch das Teminal auf 
  // ungepufferten Betrieb umngeschaltet werden...
  #include <termio.h>
  #define getch() __linux_getch()
  int __linux_getch(void);
#endif


/*
Die Füllstandsdaten landen in einerm Strukturtyp T_FRIDGE,
der für jeden Inhaltstyp einen Zähler beinhaltet und mit 
geeigneten Funktionen in einn File gespeichert und wieder 
ausgelesen werden kann.

In diesem fall ist die Anwendung von fscanf() und fprintf() 
leicht möglich, da wir das Format selbst bestimmen können.

Eine plausible emaiadresse beinhaltet keinen Whitespace,
genau ein @ und mindestens einen Punkt.

Die Menüsteuerung erfolgt über Zifferneingabe mit getch()

*/

#define FRIDGE_PATH "/home/cbx/FH/SE_2004/src/fridge.txt"

// eliminiert Tippfehler in Load/Save
#define BIER_FMT  "Bier:%d"
#define WEIN_FMT  "Wein:%d"
#define COLA_FMT  "Cola:%d"
#define PIZZA_FMT "Pizza:%d"

typedef struct
{
int nBier;
int nWein;
int nCola;
int nPizza;
} T_FRIDGE;
// int sollt eauch in Bayern genügen

// liefern jeweils 0, wenns geklappt hat.
int  fridgeLoad (char *szPath, T_FRIDGE *pFridge);
int  fridgeSave (char *szPath, T_FRIDGE *pFridge);
void fridgeMenu (T_FRIDGE *pFridge);
int  userAuth(void);

int main(int argc, char *argv[])
{
T_FRIDGE tfEisKasten;  
  
  if (fridgeLoad(FRIDGE_PATH, &tfEisKasten))
    {
    printf ("Der Eiskasten ist leer...\n");
    }

  if (userAuth())
    {
    fridgeMenu (&tfEisKasten);
    }
    
  fridgeSave(FRIDGE_PATH, &tfEisKasten);
  
  return EXIT_SUCCESS;
}

int fridgeLoad(char *szPath, T_FRIDGE *pFridge)
{
FILE *fh;

// dann ist der Kühlschrank sicher leer...
memset(pFridge, 0, sizeof (*pFridge));

fh = fopen(szPath,"r");

if (fh)
  {
  fscanf(fh, BIER_FMT,  &pFridge->nBier);
  fscanf(fh, WEIN_FMT,  &pFridge->nWein);
  fscanf(fh, COLA_FMT,  &pFridge->nCola);
  fscanf(fh, PIZZA_FMT, &pFridge->nPizza);
  fclose (fh);
  return 0;
  }
return -1;
}

int fridgeSave(char *szPath, T_FRIDGE *pFridge)
{
FILE *fh;

fh = fopen(szPath,"w");

if (fh)
  {
  fprintf(fh, BIER_FMT,  pFridge->nBier);
  fprintf(fh, WEIN_FMT,  pFridge->nWein);
  fprintf(fh, COLA_FMT,  pFridge->nCola);
  fprintf(fh, PIZZA_FMT, pFridge->nPizza);
  fclose (fh);
  return 0;
  }
return -1;
}

void fridgeMenu (T_FRIDGE *pFridge)
{
int c = 0;

do
  {
  printf("\fKühlschrank-Menü\n\n");
  
  if (pFridge->nBier)
    printf("(b)...Erdinger (%d)\n", pFridge->nBier);
  if (pFridge->nWein)
    printf("(w)...Trollinger (%d)\n", pFridge->nWein);
  if (pFridge->nCola)
    printf("(c)...Kaki-Cola (%d)\n", pFridge->nCola);
  if (pFridge->nPizza)
    printf("(p)...Calzone (%d)\n", pFridge->nPizza);
  
  printf("\nIhre Wahl: ");  
  
  c = getch();
  
  switch(c)
    {
    case 'b':
      if (pFridge->nBier)
        {
        pFridge->nBier--;
        printf ("==> Ein Erdinger. Prost!\n");
        }
        break;
        
    case 'w':
      if (pFridge->nWein)
        {
        pFridge->nWein--;
        printf ("==> Ein Trollinger. Pfui!\n");
        }
        break;
      
    case 'c':
      if (pFridge->nCola)
        {
        pFridge->nCola--;
        printf ("==> Ein Kaki-Cola. Rülps!\n");
        }
        break;
        
    case 'p':
      if (pFridge->nPizza)
        {
        pFridge->nPizza--;
        printf ("==> Eine Calzone. Mahlzeit!\n");
        }
        break;
    
    case 'R':
      pFridge->nBier  = 20;
      pFridge->nWein  =  5;
      pFridge->nCola  = 10;
      pFridge->nPizza = 10;
      printf ("==> Miraculous refill happened...\n");
      break;
            
    }
  
  }
while ('q' != c);
}

int  userAuth(void)
{
int  i;
int  nSpaces, nAts, nDots;
char szEmailAdr[128];

nSpaces = nAts = nDots = 0;

printf("Entern Sie Ihre valide Emil-Adresse: ");
gets(szEmailAdr); // gets ist gaga, aber gut wegen der Spaces

for (i = 0; szEmailAdr[i]; i++)
  {
  switch (szEmailAdr[i])
    {
    case ' ':
      nSpaces++;
      break;
    
    case '@':
      nAts++;
      break;
    case '.':
      nDots++;
      break;
    }
  }
return ( (0 == nSpaces) && (1 == nAts) && (nDots >= 1));
}


//******************************************************************
// Terminal patchen
#ifdef LINUX
int __linux_getch(void)
{
struct termios new_settings, stored_settings;
int c;

  tcgetattr(0,&stored_settings);
  new_settings = stored_settings;
  new_settings.c_lflag &= (~ICANON);
  new_settings.c_cc[VTIME] = 0;
  tcgetattr(0,&stored_settings);
  new_settings.c_cc[VMIN] = 1;
  tcsetattr(0,TCSANOW,&new_settings);
  
  c = getchar();
  
  tcsetattr(0,TCSANOW,&stored_settings);
  
  return c;
  }
#endif

syntax highlighted by Code2HTML, v. 0.9.1