# Funciones para calendarización específica de IIEE
from conexion.conexionBD import connectionBD
import datetime

def obtener_calendarizacion_iiee(codmodular, anio=None):
    """Obtiene la calendarización específica para una IIEE"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                if anio is None:
                    anio = datetime.datetime.now().year

                querySQL = ("""
                    SELECT
                        dia,
                        mes,
                        tipo_dia
                    FROM iiee_calendarizacion
WHERE codmodular = %s AND anio = %s AND mes BETWEEN 3 AND 12
                    ORDER BY mes, dia
                    """)
                cursor.execute(querySQL, (codmodular, anio))
                calendarizacion = cursor.fetchall()
        return calendarizacion
    except Exception as e:
        print(f"Error en obtener_calendarizacion_iiee: {e}")
        return []

def guardar_calendarizacion_iiee(codmodular, anio, mes, dia, tipo_dia):
    """Guarda o actualiza la calendarización para una fecha específica de una IIEE"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor() as cursor:
                querySQL = ("""
                    INSERT INTO iiee_calendarizacion (codmodular, anio, mes, dia, tipo_dia)
                    VALUES (%s, %s, %s, %s, %s)
                    ON DUPLICATE KEY UPDATE
                    tipo_dia = VALUES(tipo_dia),
                    fecha_modificacion = CURRENT_TIMESTAMP
                    """)
                cursor.execute(querySQL, (codmodular, anio, mes, dia, tipo_dia))
                conexion_MySQLdb.commit()
        return True
    except Exception as e:
        print(f"Error en guardar_calendarizacion_iiee: {e}")
        return False

def generar_calendarizacion_predeterminada(codmodular, anio):
    """Genera una calendarización predeterminada para una IIEE en un año específico"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor() as cursor:
                # Limpiar calendarización existente para el año
                cursor.execute("DELETE FROM iiee_calendarizacion WHERE codmodular = %s AND anio = %s", (codmodular, anio))

                # Generar calendarización para Marzo-Diciembre (matching frontend)
                for mes in range(3, 13):
                    # Obtener número de días en el mes
                    if mes in [1, 3, 5, 7, 8, 10, 12]:
                        dias_mes = 31
                    elif mes in [4, 6, 9, 11]:
                        dias_mes = 30
                    else:  # febrero
                        dias_mes = 29 if (anio % 4 == 0 and (anio % 100 != 0 or anio % 400 == 0)) else 28

                    for dia in range(1, dias_mes + 1):
                        # Determinar el día de la semana
                        fecha = datetime.date(anio, mes, dia)
                        dia_semana = fecha.weekday()  # 0=lunes, 6=domingo

                        # Asignar tipo de día
                        if dia_semana >= 5:  # sábado o domingo
                            tipo_dia = 'fin_semana'
                        else:
                            tipo_dia = 'lectivo'

                        # Insertar en la base de datos
                        querySQL = ("""
                            INSERT INTO iiee_calendarizacion (codmodular, anio, mes, dia, tipo_dia)
                            VALUES (%s, %s, %s, %s, %s)
                            """)
                        cursor.execute(querySQL, (codmodular, anio, mes, dia, tipo_dia))

                conexion_MySQLdb.commit()
        return True
    except Exception as e:
        print(f"Error en generar_calendarizacion_predeterminada: {e}")
        return False

def obtener_informacion_iiee(codmodular):
    """Obtiene información básica de la IIEE"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                querySQL = ("""
                    SELECT
                        e.codmodular,
                        e.horario,
                        e.ri,
                        e.pat,
                        e.pei,
                        e.calendarizacion,
                        e.mensaje_calendarizacion,
                        i.nombreie,
                        i.nivel,
                        i.direccion
                    FROM tbl_docie AS e
                    LEFT JOIN iiee AS i ON e.codmodular = i.codmodular
                    WHERE e.codmodular = %s
                    """)
                cursor.execute(querySQL, (codmodular,))
                info_iiee = cursor.fetchone()
        return info_iiee
    except Exception as e:
        print(f"Error en obtener_informacion_iiee: {e}")
        return None

def actualizar_estado_calendarizacion(codmodular, estado, comentario=None):
    """Actualiza el estado de calendarización en tbl_docie"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor() as cursor:
                if estado == 3 and comentario:
                    querySQL = ("""
                        UPDATE tbl_docie
                        SET calendarizacion = %s, mensaje_calendarizacion = %s
                        WHERE codmodular = %s
                        """)
                    cursor.execute(querySQL, (estado, comentario, codmodular))
                else:
                    querySQL = ("""
                        UPDATE tbl_docie
                        SET calendarizacion = %s
                        WHERE codmodular = %s
                        """)
                    cursor.execute(querySQL, (estado, codmodular))
                conexion_MySQLdb.commit()
        return True
    except Exception as e:
        print(f"Error en actualizar_estado_calendarizacion: {e}")
        return False
