from datetime import date, time, datetime, timedelta #incorporo la librería data time para trabajar con fechas

#LAS FECHAS MÓVILES DEPENDEN DE EN QUÉ DÍA DEL AÑO SE CELEBRA LA PASCUA DE RESURRECCIÓN, POR LO TANTO LO PRIMERO ES CALCULAR DICHA FECHA
#MUCHAS FIESTAS LOCALES SON MÓVILES. Como ejemplo he usado el carnaval, jueves y viernes Santo y la fiesta de la Hiniesta en Zamora o el toro enmaromado en Benavente
#Hay muchas más fiestas locales que dependen de la fecha de pascua... el lunes de aguas en Salamanca, el corpus y multitud de romerías
#Voy a utilizar el Algoritmo de gauss para el cálculo de la Pascua simplificación válida entre el año 1900 y 2100
#Fuente: https://www.uv.es/sofuen/actividades/actividad4/fechadepascua.pdf
#La siguiente función calcula la fecha de pascua pasandole como parámetro el año de cuyo año la quieras calcular, utiliza el algoritmo de Gauss simplificado que he mencionado.
def calcPascua(anno):
    a=int(anno%19)
    b=int(anno%4)
    c=int(anno%7)
    d=int((19*a+24)%30)
    e=int((2*b+4*c+6*d+5)%7)
    #El algoritmo da dos posibles fechas sólo una será válida
    P1=int(22+d+e)#si es en marzo
    P2=int(d+e-9)#si es en abril
    # Con esta estructura de control buscaremos cuál es la fecha válida, la de marzo o la de abril
    if P1>31:
        dPascua=int(P2)
        mes=int(4)
    else:
        dPascua=int(P1)
        mes=int(3)
    fechaPascua=date(anno,mes,dPascua)#Pasamos la fecha de Pascua a formato de fecha para hacer el resto de cálculos posteriores
    return(fechaPascua)


#Pedimos al usuario que introduzca el año del que quiere hacer el cálculo
print("ESTE PROGRAMA CALCULA LA FECHA EN LA QUE SE CELEBRARÁ LA SEMANA SANTA Y OTRAS FIESTAS MÓVILES DE UN AÑO DADO")
print("El algoritmo que calcula las fechas sólo es válido para los años del 1900 hasta el 2100")

while True: #Hasta que no haya un valor de año correcto se repite el bucle
    try:
        print("Introduce el año del que quieres conocer los festivos móviles")
        anio=int(input())
        while anio<1900 or anio>2100:#Solo permite un año comprendido entre el 1900 y el 2100
            print("Introduce un valor para el año válido, debe estar comprendido entre 1900 y 2100")
            print("Introduce el año del que quieres conocer los festivos móviles")
            anio=int(input())
        break
               
       
    except ValueError:
        print("Por favor, introduce un número entero para el valor del año")

#Invocamos la función para calcular la Pascua para un año dado:
Pascua=calcPascua(anio)
#Hago una lista con los meses para que luego la fecha pueda aparecer en formato español
meses=["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","noviembre","diciembre"]

#Calculo de otras fechas móviles en función de la Pascua
mcarnaval=Pascua-timedelta(47)#El martes de carnaval es 47 días antes de Pascua. Utilizamos timedelta para hacer la opración
lcarnaval=Pascua-timedelta(48)#El lunes de carnaval es 48 días antes de Pascua
jsanto=Pascua-timedelta(3)#El jueves santo es 3 días antes de Pascua
vsanto=Pascua-timedelta(2)#El viernes santo es 2 días antes de Pascua
hiniesta=Pascua+timedelta(50)#La festividad de la Hiniesta en Zamora es el lunes de pentecostés (50 días después de Pascua)
toroben=Pascua+timedelta(59)#La festividad del toro enmaromado de Benavente es la víspera del corpus (59 días después de Pascua)


#Se muestran por pantalla las fechas calculadas
print(f"El lunes de carnaval es el {lcarnaval.day} de {meses[lcarnaval.month-1]}")
print(f"El martes de carnaval es el {mcarnaval.day} de {meses[mcarnaval.month-1]}")
print(f"El jueves santo es el {jsanto.day} de {meses[jsanto.month-1]}")
print(f"El viernes santo es el {vsanto.day} de {meses[vsanto.month-1]}")
print(f"La Pascua es el {Pascua.day} de {meses[Pascua.month-1]}")
print(f"La Hiniesta (festivo local en Zamora) es el {hiniesta.day} de {meses[hiniesta.month-1]}")
print(f"El toro enmaromado de Benavente (festivo local en Benavente) es el {toroben.day} de {meses[toroben.month-1]}")


    
