#include "commun.h"
#include <stdio.h>

#include "copydiff.h"
#include "ctrldate.h"
#include "recurdir.h"
#include "fileparam.h"
#include "trtdir.h"
#include "trtfile.h"
#include "section.h"
#include "copyfile.h"
#include <string.h>
#define false 0
#define true  1
#define bool int

bool bTemporaire = false;
char help[] = {"\n\ncopydiff - Supertos - Mars 2006 - Version 1.00\n\n"
				"Utilisation : copydiff -p fichier_parametre [-dd 99/99/9999] [-df 99/99/9999]\n\n"
				"Le fichier parametre (renseigne avec Bloc-Notes sous Windows par exemple) pourra contenir les sections suivantes:\n"
				"[DATEDEBUT] [DATEFIN] (falcultatifs) suivi a ligne suivante d'une date au format 99/99/9999\n\n"
				"[DIRSRC] suivi du/des repertoire(s) sources dirsrc\n\n"
				"[DIRDEST] un repertoire destination par repertoire source\n\n"
				"[DIREXCLUS] (falcutatif) repertoire a exclure (chemin complet)\n\n"
				"[FILEINCLUS][FILEEXCLUS] (falcutatif) liste des fichiers à inclure ou exclure\n\n"
				"Exemple:\n\n"
				"[dirsrc]\n/home/user\n\n"
				"[dirdest]\n/tmp\n\n"
				"[fileinclus]\n*.cpp\n*.o\nml*.txt\n\n"
				"[fileexclus]\n*.o\n\n"
				"A noter dans cet exemple, *.o et à la fois inclus et exclus. Au final, ce sera l'exclusion du *.o qui se pris en compte.\n"
				"Attention, si vous créez une section [fileinclus] vide, alors aucun fichier ne sera inclus...\n\n"
				"[direxclus]\n/home/user/backup\n\n"
				"Vous utilisez ce programme a vos risques et périls ! Je ne serais en aucun cas être tenu pour responsable de problèmes causés par l'utilisation de ce programme !\n\n" 
				"FIN DE L'AIDE\n\n"};



int main (int argc, char * argv[])
{
	char * BufSec;
	char cFileParam[400];
	int iTailleSection;
	int iNumSect, iCpt;
	char szPath[1000], szPathDest[1000];
	bool bResult, bResultDest;
	char szErreur [300];

	if (argc > 1)
	{
		iCpt = 1;
		cFileParam[0] = 0;

		do
		{
			if (strcmp (argv[iCpt], "-h") == 0 || strcmp (argv[iCpt], "-H") == 0 || strcmp (argv[iCpt], "-help") == 0 || strcmp (argv[iCpt], "-HELP") == 0 || strcmp (argv[iCpt], "-?") == 0 || strcmp (argv[iCpt], "/?") == 0)
			{
				printf (help);
				return PBPARM;
			}

			if (strcmp (argv[iCpt], "-p") == 0 || strcmp (argv[iCpt], "-P") == 0)
			{
				if (iCpt+1 <= argc)
					strcpy (cFileParam, argv[iCpt+1]);							
			}
		}while (++iCpt < argc && cFileParam[0] == 0);

		if (cFileParam[0] != 0)
		{
			InitDate (); // Initialisation du module de contr�le des dates

			if (OpenFileParam(cFileParam))
			{
				/* Lecture des diff�rentes sections du fichier param�tre */
			
				BufSec = 0;
				iNumSect = 0;

				do
				{
					iNumSect = FindFirstNextSection(&BufSec, &iTailleSection);

					switch (iNumSect)
					{
						case SDATEDEBUT:
							ConvASCDate (DATEDEBUT, BufSec, iTailleSection);
						break;

						case SDATEFIN:
							ConvASCDate (DATEFIN, BufSec, iTailleSection);
						break;

						case SDIRSRC:
							InitDirSrc(BufSec, iTailleSection);
						break;

						case SDIRDEST:
							InitDirDest(BufSec, iTailleSection);
						break;

						case SFILEEXCLUS:
							InitFileExclus(BufSec, iTailleSection);
						break;

						case SFILEINCLUS:
							InitFileInclus(BufSec, iTailleSection);
						break;

						case SDIREXCLUS:
							InitDirExclus(BufSec, iTailleSection);
						break;
					}
				} while (iNumSect != 0);

				// Traitement des param�tres en entr�e
				if (argc > 1)
				{
					iCpt = 1;
					do
					{
						if (strcmp (argv[iCpt], "-P") == 0 || strcmp (argv[iCpt], "-p") == 0)
						{
							iCpt++;
							// Deja traite		
						}
						else
							if (strcmp (argv[iCpt], "-DD") == 0 || strcmp (argv[iCpt], "-dd") == 0)
							{
								if (iCpt < argc)
								{
									ConvASCDate (DATEDEBUT, argv[iCpt + 1], strlen (argv[iCpt + 1]));
									iCpt++;
								}
								else
								{
									GenereErreur ("Param�tre incorrecte");
									CloseFileParam ();
									return PBPARM;
								}
							}
							else
								if (strcmp (argv[iCpt], "-DF") == 0 || strcmp (argv[iCpt], "-df") == 0)
								{
									if (iCpt < argc)
									{
										ConvASCDate (DATEFIN, argv[iCpt + 1], strlen (argv[iCpt + 1]));
										iCpt++;
									}
									else
									{
										GenereErreur ("Param�tre incorrecte");
										CloseFileParam ();
										return PBPARM;
									}
								}
								else
								{

									if (strcmp (argv[iCpt], "-H") == 0 || strcmp (argv[iCpt], "-HELP") == 0 || strcmp (argv[iCpt], "-?") == 0 || strcmp (argv[iCpt], "/?") == 0)
									{
										printf (help);

										CloseFileParam ();
										return PBPARM;
									}
									else
									{
										GenereErreur ("Param�tre incorrecte");
										CloseFileParam ();
										return PBPARM;
									}
								}
						iCpt++;
					}while (iCpt < argc);
				}
				// Ok, dernieres v�rifications...
					if (TstDate()) // Ctrl que les dates sont bonnes
					{
						// Allons-y pour le traitement de tout cela !
						bResult = FindFirstNextDirSrc(szPath); // R�pertoire source
						// Maintenant on cherche le r�pertoire cible
						bResultDest = FindFirstNextDirDest(szPathDest); // R�pertoire destination
						if (bResult && bResultDest)
						{
							do
							{
								if (szPath[0] != 0)
								{
									InitCopy();
									InitRecurDir (szPath);

									printf ("Traitement de ");
									printf (szPath);
									printf (":\n");
									recurdir (szPath, szPathDest);

									if (!TstCopy())
										printf ("Pas de modification d�tect�e...\n");
								}

								bResult = FindFirstNextDirSrc(szPath);
								if (bResult && szPath[0] != 0)
								{
									bResultDest = FindFirstNextDirDest(szPathDest); // R�pertoire destination
								}
							} while (bResult && bResultDest);
						}
						else
						{
							sprintf (szErreur, "Pb.: pas de repertoire destination pour le repertoire source %s", szPath);
							GenereErreur (szErreur);
							CloseFileParam ();
							return PBPARM;
						}
					}
					else
					{
						CloseFileParam ();
						return PBDATES;
					}
			}
			else
			{
				GenereErreur ("Impossible de lire le fichier param�tre");
				CloseFileParam ();
				return PBFILEPARM;
			}
		}
		else
		{
			GenereErreur ("Impossible de lire le fichier param�tre");
			CloseFileParam ();
			printf (help);
			return PBFILEPARM;
		}
	}
	else
	{
		GenereErreur ("Impossible de lire le fichier param�tre");
		CloseFileParam ();
		printf (help);
		return PBFILEPARM;
	}

	CloseFileParam ();
 
	return 0;
}
