#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <string.h>

#include "commun.h"

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define CTRLDATE true
#define JOUR  1
#define MOIS  2
#define ANNEE 3
#define FIN   4

#include "ctrldate.h"

#define false 0
#define true  1

time_t tDateDebut;
time_t tDateFin;
time_t tSysteme;

char cDateSys[12];

int ConvDate (int bDDF, int iYear, int iMonth, int iDay)
{
	char szErreur[200];
	/*     The tm structure contains the following members:

     int  tm_sec;      seconds after the minute [0, 61]  
     int  tm_min;      minutes after the hour [0, 59] 
     int  tm_hour;     hour since midnight [0, 23] 
     int  tm_mday;     day of the month [1, 31] 
     int  tm_mon;      months since January [0, 11] 
     int  tm_year;     years since 1900 
     int  tm_wday;     days since Sunday [0, 6] 
     int  tm_yday;     days since January 1 [0, 365] 
     int  tm_isdst;    flag for daylight savings time */
    struct tm time_str;

	time_str.tm_year    = iYear - 1900;
    time_str.tm_mon     = iMonth - 1;
    time_str.tm_mday    = iDay;

    time_str.tm_isdst   = -1;

	if (bDDF == DATEDEBUT)
	{
		time_str.tm_hour = 0;
		time_str.tm_min = 0;
		time_str.tm_sec = 1;

		tDateDebut = mktime(&time_str);
		if (tDateDebut == -1)
		{
			strcpy (szErreur, "Erreur sur la date de début des modifications");
			GenereErreur (szErreur);
			return false;
		}
	}
	else
	{
		time_str.tm_hour = 23;
		time_str.tm_min = 59;
		time_str.tm_sec = 59;

		tDateFin = mktime(&time_str);
		if (tDateFin == -1)
		{
			strcpy (szErreur, "Erreur sur la date de fin des modifications");
			GenereErreur (szErreur);
			return false;
		}
	}
	return true;
}

/*-------------------------------------------------------------------------*/
// Convertion date ascii au format jj/mm/aaaa ou / peut aussi etre . ou - et aaaa à aa
// en temps en seconde ...
// Il peut travailler sur le contenu d'une section, il y a donc suppression ' ' et retour chariot
// Pas de vérification de présence de caractères parasites sur les lignes suivant la lecture de la date
// 
// Code testé et ok le 03/03/06
//
/*-------------------------------------------------------------------------*/
int ConvASCDate (int bDDF, char* szDate, int iTaille)
{
	int iYear, iMonth, iDay, iEtape;
	char *szDateTrt;
	char szErreur[200];

	szDateTrt = szDate;

	iYear = -1;
	iMonth = 0;
	iDay = 0;

	iEtape = JOUR;

	if (szDateTrt != 0)
	{
		if (* szDateTrt == ' ' || * szDateTrt == 13 || * szDateTrt == 10)
		{
			do
			{
				szDateTrt+=1;
			}while (szDateTrt <= szDate + iTaille && (* szDateTrt == ' ' || * szDateTrt == 13 || * szDateTrt == 10));
		}

		if (szDateTrt <= szDate + iTaille)
		{
			// Caractères trouvés ...
			if (* szDateTrt >= '0' && * szDateTrt <= '9')
			{
				do
				{
					switch (iEtape)
					{
						case JOUR:
							iDay = iDay * 10 + (* szDateTrt - '0');
							if (iDay > 31) 
							{
								if (bDDF)
									strcpy (szErreur, "Erreur sur la date de début - jour > 31 !");
								else
									strcpy (szErreur, "Erreur sur la date de fin - jour > 31 !");
								GenereErreur (szErreur);
								return false;
							}
						break;

						case MOIS:
							iMonth = iMonth * 10 + (* szDateTrt - '0');
							if (iMonth > 12) 
							{
								if (bDDF)
									strcpy (szErreur, "Erreur sur la date de début - mois > 12 !");
								else
									strcpy (szErreur, "Erreur sur la date de fin - mois > 12 !");
								GenereErreur (szErreur);
								return false;
							}
						break;

						case ANNEE:
							if (iYear == -1)
								iYear = 0;
							iYear = iYear * 10 + (* szDateTrt - '0');
							if (iYear > 9999) 
							{
								if (bDDF)
									strcpy (szErreur, "Erreur sur la date de début - annee trop grande !");
								else
									strcpy (szErreur, "Erreur sur la date de fin - annee trop grande !");
								GenereErreur (szErreur);
								return false;
							}
						break;
					}

					szDateTrt+=1;
					
					if (*szDateTrt == '/' || *szDateTrt == '-' || *szDateTrt == '.')
					{
						if (iEtape < FIN)
						{
							iEtape ++;
							szDateTrt+=1;
						}
					}

					if (* szDateTrt == 13 || * szDateTrt == 10 || *szDateTrt == 0)
						iEtape = FIN;
					else
					{
						if (* szDateTrt < '0' || * szDateTrt > '9')
						{
							if (bDDF)
								strcpy (szErreur, "Erreur sur la date de début - caractere parasite !");
							else
								strcpy (szErreur, "Erreur sur la date de fin - caractere parasite !");
							GenereErreur (szErreur);
							return false;
						}
					}

				} while (iEtape != FIN && szDateTrt <= szDate + iTaille);

				if (iEtape == FIN)
				{
					// Contrôle de la date récupérée
					if (iDay == 0 || iMonth == 0 || iYear == -1 || (iYear < 2000 && iYear > 99))
					{
						if (bDDF)
							strcpy (szErreur, "Erreur sur la date de début - valeurs incorrectes !");
						else
							strcpy (szErreur, "Erreur sur la date de fin - valeurs incorrectes !");
						GenereErreur (szErreur);
						return false;
					}
					else
					{
						// Pas d'erreur
						if (iYear < 100)
							iYear+=2000;
						// On peut eventuellement controler qu'il n'y a pas de caratères parasites ensuite...

						// Convertir la date en seconde...
						ConvDate (bDDF, iYear, iMonth, iDay);
					}
				}
				else
				{
					if (bDDF)
						strcpy (szErreur, "Erreur sur la date de début - date incomplète !");
					else
						strcpy (szErreur, "Erreur sur la date de fin - date incomplète !");
					GenereErreur (szErreur);
					return false;
				}
			}
			else
			{
				if (bDDF)
					strcpy (szErreur, "Erreur sur la date de début - caractere parasite !");
				else
					strcpy (szErreur, "Erreur sur la date de fin - caractere parasite !");
				GenereErreur (szErreur);

				return false;
			}
		}
	}
	return true;
}

int CtrlDateFile (char * szFile)
{
     char szErreur[300];
	
     struct stat buf;

	if (stat(szFile, &buf) == 0)
	{
 #ifdef DEBUGTST
        sprintf (szErreur, "Date fichier %d, Date debut %d fin %d", buf.st_mtime, tDateDebut, tDateFin);
        GenereErreur (szErreur);
 #endif
		if (buf.st_mtime >= tDateDebut && buf.st_mtime <= tDateFin)
			return true;
		else
			return false;
	}
	else
	{
		sprintf (szErreur, "Erreur durant la lecture de l'heure sur %s", szFile);
		GenereErreur (szErreur);
		return false;
	}
}

int TstDate()
{
	char szErreur[200];
	if (tDateFin != 0)
	{
		if (tDateDebut > tDateFin)
		{
			sprintf (szErreur, "Erreur la date de fin doit etre superieure a la date de debut%s");
			GenereErreur (szErreur);
			return false;
		}
	}
	else
		tDateFin = tDateDebut + 86399;
	return true;
}

int InitDate ()
{
    struct tm *tmDateSys;
    
    tSysteme = time(0); // Date et heure système en seconde
   /* Convertir (ConvDate) les dates par défaut */
	tDateFin = 0;
	tmDateSys = localtime(&tSysteme); // Convertion seconde en structure tm
	strftime ( cDateSys, sizeof (cDateSys), "%d/%m/%Y", tmDateSys); 
	ConvASCDate (DATEDEBUT, cDateSys, strlen(cDateSys));
	strftime ( cDateSys, sizeof (cDateSys), "%Y%m%d", tmDateSys); // Sera utiliser sur le nom du fichier zip
	return true;
}
