#include "demo.h"
#include "Daten.h" 
 
 struct DateTime theday;


 
/*************************************************************************
 *************************************************************************
 *************************************************************************

Function: ConvertToDays()
 Converts a string into days (since 1.1.78, I think).
 First tries Start_Format as format and if that does not work, it
 checks every possible format.

Return:
 -1: No valid date
 >0: Number of days 
 
Author: Rüdiger Dreier

History:
 04.04.1992: Initial version
 10.10.1993: No checks every possible format.
 11.10.1993: Start_Format as first check added (otherwise there are problems
             with the two formats dd.mm.yy and mm.dd.yy ...)
             
 *************************************************************************
 *************************************************************************
 *************************************************************************/
 
 LONG ConvertToDays(char *date)
  {
   LONG result;
   LONG Days, i;
   
   if(!date) return(-1);
   
   if(date[strlen(date)-1] == ' ') date[strlen(date)-1] = 0;
   
   theday.dat_Format  = Start_Format;
   theday.dat_StrDate = date;
   
   if(date[0] == 0) return(-1); /* Leerer String = FEHLER */
   
   /* Zunächst mit gewähltem Format probieren    */
   /* Falls nicht erkannt, alle Format probieren */
   result = StrToDate(&theday);
   if(!result)
    {
     for(i=0;i<=4;i++)
      {
       theday.dat_Format  = i;
       result = StrToDate(&theday);
       if(result) break;
      }
    }
   
   if(result == 0) return(-1);
   
   Days = theday.dat_Stamp.ds_Days;
   
   /* Days wieder in String wandeln */
   ConvertToString(Days, date);
   
   return(Days);
  }







 
/*************************************************************************
 *************************************************************************
 *************************************************************************

Function: ConvertToString()
 Converts an integer (number of days since 1.1.78) to a string. 
 Start_Format is used as format. 

Return: VOID

Author: Rüdiger Dreier

History:
 07.09.1992: Initial version

 *************************************************************************
 *************************************************************************
 *************************************************************************/
 
 VOID ConvertToString(LONG Days, char *Ziel)
  {
   LONG result;
   char Buffer[20];
   
   theday.dat_Stamp.ds_Days = Days;
   theday.dat_Format        = Start_Format ;
   theday.dat_StrDate       = Buffer;
   
   /* Datum ins Einheitsformat wandeln */
   result = DateToStr(&theday);
   if(Buffer[strlen(Buffer)-1] == ' ') Buffer[strlen(Buffer)-1] = 0;
   if(result != 0) strcpy(Ziel,Buffer);
  }









 
 

/*************************************************************************
 *************************************************************************
 *************************************************************************

Function: ReCalcTreib()
 Recalculates every entries in the fuel list. Some global datas (kilometer
 etc.) are updated, too.

Return:
 FALSE: No errors
 >0: date (days since 1.1.78) of entry with negative delta kilometer

Author: Rüdiger Dreier

History:
 01.10.1993: Initial version

 *************************************************************************
 *************************************************************************
 *************************************************************************/

 LONG ReCalcTreib(VOID)
  {
   struct NodeTreib *nt;
   struct NodeUnter *nu;
   LONG maxt, maxu, i;
   LONG lastkm = Start_KM;
   DOUBLE Liter = 0., Preist = 0., Preisu = 0.;
   LONG flag = FALSE;
   
   get(LI_Treib, MUIA_List_Entries, &maxt);
   get(LI_Unter, MUIA_List_Entries, &maxu);
   
   DoMethod(LI_Treib, MUIM_List_GetEntry, maxt-1, &nt);
   DoMethod(LI_Unter, MUIM_List_GetEntry, maxu-1, &nu);
   
   strcpy(Daten.SDatum,"---------");
   strcpy(Daten.EDatum,"---------");
   Daten.Kilometer = 0;
   
   for(i=0;i<maxt;i++)
    {
     DoMethod(LI_Treib, MUIM_List_GetEntry, i, &nt);
     
     nt->deltakm   = nt->kmStand-lastkm;
     lastkm        = nt->kmStand;
     if(nt->deltakm <= 0) flag = nt->Days;
     
     if(nt->deltakm != 0.)
      {
       nt->Verbrauch = 100.*nt->Liter/(nt->deltakm);
      }
     else
      {
       nt->Verbrauch = 0.;
      }
     Liter  += nt->Liter;
     Preist += nt->Preis;
     FillTreib(nt);
    }
   
   if(nt)
    {
     Daten.Kilometer = nt->kmStand - Start_KM;
     if(nu)
      {
       if(nu->Days > nt->Days)
        {
         strcpy(Daten.EDatum, nu->Datum);
        }
       else
        {
         strcpy(Daten.EDatum, nt->Datum);
        }
      }
     else
      {
       strcpy(Daten.EDatum, nt->Datum);
      }
    }
   if(Start_Day != 0) strcpy(Daten.SDatum, Start_Datum);
   
   for(i=0;i<maxu;i++)
    {
     DoMethod(LI_Unter, MUIM_List_GetEntry, i, &nu);
     Preisu += nu->Preis;
    }
   Daten.TreibGes = Preist;
   Daten.UnterGes = Preisu;
   Daten.Liter    = Liter;
   
   sprintf(Daten.Literstring, FORMAT_LITER"%s", 
           Liter,
           TEXT(MSG_LITER_SHORT_TEXT));
   sprintf(Daten.UnterGesstring, FORMAT_DM"%s", 
           Preisu,
           TEXT(MSG_MONEY_SHORT_TEXT));
   sprintf(Daten.TreibGesstring, FORMAT_DM"%s", 
           Preist,
           TEXT(MSG_MONEY_SHORT_TEXT));
   sprintf(Daten.Gesstring, FORMAT_DM"%s", 
           Preist+Preisu,
           TEXT(MSG_MONEY_SHORT_TEXT));
   sprintf(Daten.kmstring, FORMAT_KILOMETER"%s", 
           Daten.Kilometer,
           TEXT(MSG_KILOMETER_SHORT_TEXT));
   
   if(Daten.Kilometer > 0)
    {
     Daten.Verbrauch = 100.*Liter/Daten.Kilometer;
     sprintf(Daten.UnterGesKMstring, 
             FORMAT_DM2"%s", 
             Preisu/Daten.Kilometer,
             TEXT(MSG_DMPERKM_SHORT_TEXT));
     sprintf(Daten.TreibGesKMstring, 
             FORMAT_DM2"%s", 
             Preist/Daten.Kilometer,
             TEXT(MSG_DMPERKM_SHORT_TEXT));
     sprintf(Daten.Verbrauchstring, 
             FORMAT_LITER2"%s", 
             Daten.Verbrauch,
             TEXT(MSG_LPERKM_SHORT_TEXT));
     sprintf(Daten.GesKMstring, 
             FORMAT_DM2"%s", 
             (Preist+Preisu)/Daten.Kilometer,
             TEXT(MSG_DMPERKM_SHORT_TEXT));
    }
   else
    {
     strcpy(Daten.UnterGesKMstring, "--------");
     strcpy(Daten.TreibGesKMstring, "--------");
     strcpy(Daten.Verbrauchstring , "--------");
     strcpy(Daten.GesKMstring     , "--------");
    }
   
   
   set(TX_Gad3, MUIA_Text_Contents, &Daten.UnterGesstring);
   set(TX_Gad4, MUIA_Text_Contents, &Daten.UnterGesKMstring);
   set(TX_Gad5, MUIA_Text_Contents, &Daten.TreibGesstring);
   set(TX_Gad6, MUIA_Text_Contents, &Daten.TreibGesKMstring);
   set(TX_Gad7, MUIA_Text_Contents, &Daten.Gesstring);
   set(TX_Gad8, MUIA_Text_Contents, &Daten.GesKMstring);
   set(TX_Gad9, MUIA_Text_Contents, &Daten.kmstring);
   set(TX_Gad10, MUIA_Text_Contents, &Daten.Literstring);
   set(TX_Gad11, MUIA_Text_Contents, &Daten.Verbrauchstring);
   
   sprintf(TitelString1, 
           TEXT(MSG_DATA_FOR_CAR_TEXT),
           Start_Kennzeichen);
   sprintf(TitelString2,
           TEXT(MSG_DATA_FOR_TIME_TEXT), 
           Daten.SDatum,
           Daten.EDatum,
           FilePart(FileName));
   set(TX_Gad1, MUIA_Text_Contents, &TitelString1);
   set(TX_Gad2, MUIA_Text_Contents, &TitelString2);
   DoMethod(LI_Treib,MUIM_List_Redraw,MUIV_List_Redraw_All);
   
   return(flag);
  }
 
 



/*************************************************************************
 *************************************************************************
 *************************************************************************

Function: FillTreib()
 Fills the string entries of fuel list with the correct values.

Return: VOID

Author: Rüdiger Dreier

History:
 01.01.1993: Inital version

 *************************************************************************
 *************************************************************************
 *************************************************************************/
 
 VOID FillTreib(struct NodeTreib *nt)
  {
   sprintf(nt->kmstring,FORMAT_KILOMETER"%s",
           nt->kmStand,
           TEXT(MSG_KILOMETER_SHORT_TEXT));
   sprintf(nt->deltakmstring,FORMAT_DKILOMETER"%s", 
           nt->deltakm, 
           TEXT(MSG_KILOMETER_SHORT_TEXT));
   sprintf(nt->Verbrauchstring,FORMAT_VERBRAUCH"%s",
           nt->Verbrauch,
           TEXT(MSG_LPERKM_SHORT_TEXT));
   sprintf(nt->Literstring,FORMAT_LITER"%s",
           nt->Liter,
           TEXT(MSG_LITER_SHORT_TEXT));
   sprintf(nt->Preisstring,FORMAT_PREIS"%s",
           nt->Preis,
           TEXT(MSG_MONEY_SHORT_TEXT));
   
   ConvertToString(nt->Days, nt->Datum);
  }






/*************************************************************************
 *************************************************************************
 *************************************************************************

Function: FillUnter()
 Fills the string entries of support list with the correct values.

Return: VOID

Author: Rüdiger Dreier

History:
 01.10.1993: Initial version

 *************************************************************************
 *************************************************************************
 *************************************************************************/
 
 VOID FillUnter(struct NodeUnter *nt)
  {
   sprintf(nt->Preisstring, FORMAT_PREIS"%s", 
           nt->Preis,
           TEXT(MSG_MONEY_SHORT_TEXT));
   ConvertToString(nt->Days, nt->Datum);
  }
 
 





/*************************************************************************
 *************************************************************************
 *************************************************************************

Function: CheckTreibList()
 Checks, if there is an entry in fuel list with the same date (day).

Return: 
 1: No such entry
 0: There is such an entry

Author: Rüdiger Dreier

History:
 01.10.1993: Initial version

 *************************************************************************
 *************************************************************************
 *************************************************************************/

 LONG CheckTreibList(LONG day)
  {
   LONG i;
   LONG flag = TRUE;
   struct NodeTreib *nt;
   
   get(LI_Treib, MUIA_List_Entries, &i);
   i--;
   
   while(i >= 0)
    {
     DoMethod(LI_Treib, MUIM_List_GetEntry, i, &nt);
     if(nt->Days == day) 
      {
       flag = FALSE;
       break;
      }
     if(nt->Days < day) break;
     i--;
    }
   //   printf("CheckTreib : %ld\n",flag);
   return(flag);
  }
