/****************************************************************
*																*
* Nombre: ABRAHAM GAUSACHS HERNANDEZ, WIDA308					*
*																*
* Descripción: Calcula los dias dados entre 2 fechas del s.XXI	*
*																*
* Data: 12 de Octubre de 2001									*
*																*
*****************************************************************/

/* Este programa calcula la cantidad de dias que hay entre una fecha y otra
de este siglo. Tb comprueba que la fecha introducida sea correcta.
La idea es: 	coge las dos fechas
				comprueba las dos fechas
				realiza la diferenci
				printa salida

Ejemplo:

El usuario escribe 	10 01 01:
					10 02 01
	Diferencia en dias: 365.

Este programa esta realizado aprovechando las funciones de la libreria de C time.h
como por ejemplo difftime(q calcula la diferencia en segundos) y mktime que usa una
fecha para pasarla a formato time_t. Lo malo de estas funciones es que toman sus valores
a partir del uno de enero de 1970 (?no se porque¿), pero como estamos tratando con el siglo
21 (2000-2099) no hay problema.
*/

/****************************DECLARACIONES*********************************************/

#include <stdio.h>
#include  <time.h>
int bisiesto(int year);
int comprueba(int dia,int mes,int ano);

/********************************MAIN**************************************************/

void main()  {

	double dd; 				//Diferencia entre Dias
	int suma;				//Resultado de las comprobaciones
	struct tm fecha1;		//Estructuras de C para las fechas
	struct tm fecha2;
	time_t data1;
	time_t data2;

	printf ("Entra una fecha de este siglo (dd mm aa) EJEMPLO: 03 12 01  \n");
	scanf ("%d %d %d", &fecha1.tm_mday, &fecha1.tm_mon, &fecha1.tm_year);
	printf ("Entra otra fecha de este siglo (dd mm aa) EJEMPLO: 04 11 09  \n");
	scanf ("%d %d %d", &fecha2.tm_mday, &fecha2.tm_mon, &fecha2.tm_year);


	fecha1.tm_mon = fecha1.tm_mon - 1; 		//Restamos uno xq los meses son a partir de enero
	fecha2.tm_mon = fecha2.tm_mon - 1; 		//con lo que enero es el mes 0 y diciembre el 11.
	fecha1.tm_year = fecha1.tm_year + 100;	//Sumamos 100 para tratar con fechas del
	fecha2.tm_year = fecha2.tm_year + 100;	//siglo XXI.

	fecha1.tm_sec = 0;	// Tenemos que inicializar las horas de las dos estructuras
	fecha1.tm_min = 0;	// porque si no funciona.
	fecha1.tm_hour = 0;
	fecha2.tm_sec = 0;
	fecha2.tm_min = 0;
	fecha2.tm_hour = 0;


	suma = comprueba(fecha1.tm_mday,fecha1.tm_mon,fecha1.tm_year);
	suma = suma + comprueba(fecha2.tm_mday,fecha2.tm_mon,fecha2.tm_year);

	if (suma == 2){			// Sera 2 cuando la comprobacion de ambos numeros halla sido correcta.
		data1 = mktime(&fecha1); //formateamos las fechas para tratarlas como t_time
		data2 = mktime(&fecha2);
		dd=difftime(data2, data1);
		printf("\nDiferencia en dias entre las dos fechas: %lf\n", dd/(24*60*60));
	}
	else{
		printf("Ha habido un error en las fechas insertadas.\n");
	}
}

/****************************FUNCIONES**************************************************/

//MIRA SI EL ANO ES BISIESTO
int bisiesto(int year)
{
	int esbisiesto = 0;
	if (year % 400 == 0)
		esbisiesto = 1;
	else if ( year % 4 == 0 && year % 100 != 0 )
		esbisiesto = 1;
	return esbisiesto;
}

//MIRA SI LAS FECHAS SON CORRECTAS
int comprueba(int dia,int mes,int ano){
	int correcto = 0;

	if (ano >= 100 && ano < 200 ){
		correcto = 1;						//0 no es correcte, 1 si es correcte
	}

	if (mes > 12 || mes < 0){
		correcto = 0;
	}

	if (mes == 1 && dia == 29){
		if (bisiesto(ano+1900) == 0){
			correcto = 0;
		}else{correcto = 1;}
	}
	return correcto;
}