from app import app
from flask import render_template, request, flash, redirect, url_for, session,  jsonify, send_file
from mysql.connector.errors import Error
from werkzeug.utils import secure_filename
import uuid


# Importando cenexión a BD
from controllers.funciones_ie import *
from controllers.funciones_profesores import UPLOAD_FOLDER, allowed_file, subir_documento_profesor, sql_doc_profesoresBD, sql_profesorBD, eliminar_documento_profesor
from conexion.conexionBD import connectionBD
import os
from os import remove #Modulo  para remover archivo
from os import path #Modulo para obtener la ruta o directorio

PATH_URL = "public/colegios"

@app.route('/lista-de-ie', methods=['GET'])
def lista_ie():
    if 'conectado' in session:
        # Verificar si es admin
        if session.get('admin') == 1:
            return redirect(url_for('admin_dashboard'))
        else:
            return render_template(f'{PATH_URL}/lista_ie.html', empleados=sql_lista_ieBD())
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))

@app.route('/iiee/<string:id>', methods=['GET'])
def lista_tbl_docie(id):
    if 'conectado' in session:
        info = sql_detalles_ieBD(id)
        documentos = [info] if info else []
        codmodular = id
        print(f"DEBUG: lista_tbl_docie - info: {info}, documentos: {documentos}")
        return render_template(f'{PATH_URL}/lista_colegios.html',
                             documentos=documentos,
                             codmodular=codmodular,
                             info=info)
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/actualizar-tbl_docie/<string:id>', methods=['POST'])
def actualizar_tbl_docie(id):
    if 'conectado' in session:
        if request.method == 'POST':
            file = request.files['archivo']
            if file:
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'

                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)

                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))

                # Actualizar nombre de archivo en BD
                procesar_actualizacionie_form(request, id)

                flash('Archivo actualizado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))




def validate_file_size(file, max_size_mb=100):
    """Validar tamaño de archivo antes de guardar"""
    if not file or not file.filename:
        return False, "No se seleccionó ningún archivo"
    
    # Obtener tamaño del archivo
    file.seek(0, 2)  # Ir al final del archivo
    file_size = file.tell()  # Obtener tamaño en bytes
    file.seek(0)  # Volver al inicio
    
    max_size_bytes = max_size_mb * 1024 * 1024  # Convertir MB a bytes
    
    print(f"DEBUG: Validando archivo - Nombre: {file.filename}, Tamaño: {file_size / (1024*1024):.2f}MB, Máximo permitido: {max_size_mb}MB")
    
    if file_size > max_size_bytes:
        return False, f"El archivo es demasiado grande. Tamaño actual: {file_size / (1024*1024):.2f}MB. Tamaño máximo permitido: {max_size_mb}MB"
    
    if file_size == 0:
        return False, "El archivo está vacío"
    
    return True, "OK"

@app.route('/upload_horario/<string:id>', methods=['POST'])
def upload_horario(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET horario = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('Horario cargado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/upload_ri/<string:id>', methods=['POST'])
def upload_ri(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET ri = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('RI cargado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/upload_pat/<string:id>', methods=['POST'])
def upload_pat(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET pat = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('PAT cargado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/upload_pei/<string:id>', methods=['POST'])
def upload_pei(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET pei = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('PEI cargado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/upload_horario_estudiante/<string:id>', methods=['POST'])
def upload_horario_estudiante(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET horario_estudiante = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('Horario estudiante cargado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/upload_pci/<string:id>', methods=['POST'])
def upload_pci(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET pci = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()

                flash('Otros documentos cargados correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))



@app.route('/upload_otros/<string:id>', methods=['POST'])
def upload_otros(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:

                        cursor.execute("UPDATE tbl_docie SET otros = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('Otros documentos cargados correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))

# Nuevas rutas para documentos OTROS múltiples


@app.route('/upload_otros_multiple/<string:id>', methods=['POST'])
def upload_otros_multiple(id):
    if 'conectado' in session:
        if 'archivo' in request.files and 'nombre_documento' in request.form:
            file = request.files['archivo']
            nombre_documento = request.form.get('nombre_documento', '').strip()
            
            print(f"DEBUG upload_otros_multiple: Iniciando carga para codmodular {id}")
            print(f"DEBUG upload_otros_multiple: Archivo: {file.filename}, Nombre documento: {nombre_documento}")
            
            if file.filename == '':
                flash('No se seleccionó ningún archivo', 'error')
                return redirect(url_for('lista_tbl_docie', id=id))
            
            if not nombre_documento:
                flash('El nombre del documento es requerido', 'error')
                return redirect(url_for('lista_tbl_docie', id=id))
            
            # Validar tamaño del archivo
            is_valid, error_msg = validate_file_size(file)
            if not is_valid:
                flash(error_msg, 'error')
                return redirect(url_for('lista_tbl_docie', id=id))
            
            # Guardar archivo con nombre único
            filename = secure_filename(file.filename)
            extension = path.splitext(filename)[1]
            nuevoNombreFile = uuid.uuid4().hex + extension
            upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
            
            print(f"DEBUG upload_otros_multiple: Nuevo nombre archivo: {nuevoNombreFile}")
            
            if not os.path.exists(upload_dir):
                os.makedirs(upload_dir)
            
            upload_path = os.path.join(upload_dir, nuevoNombreFile)
            try:
                file.save(upload_path)
                print(f"DEBUG upload_otros_multiple: Archivo guardado en: {upload_path}")
            except Exception as e:
                print(f"DEBUG upload_otros_multiple: Error al guardar archivo: {e}")
                flash(f'Error al guardar el archivo: {str(e)}', 'error')
                return redirect(url_for('lista_tbl_docie', id=id))
            

            # Agregar a la lista de documentos OTROS
            print(f"DEBUG upload_otros_multiple: Llamando sql_add_otros_documento con parámetros: id={id}, filename={nuevoNombreFile}, nombre_documento={nombre_documento}")
            
            # Ejecutar diagnóstico antes de intentar agregar el documento
            print(f"DEBUG upload_otros_multiple: Ejecutando diagnóstico de base de datos...")
            sql_check_otros_field_type(id)
            
            try:
                success, message = sql_add_otros_documento(id, nuevoNombreFile, nombre_documento)
                print(f"DEBUG upload_otros_multiple: Resultado de sql_add_otros_documento - Success: {success}, Message: {message}")
                
                if success:
                    flash(f'{message}', 'success')
                else:
                    flash(f'{message}', 'error')
                    # Eliminar archivo si falla la inserción en BD
                    try:
                        os.remove(upload_path)
                        print(f"DEBUG upload_otros_multiple: Archivo eliminado después del error: {upload_path}")
                    except Exception as remove_error:
                        print(f"DEBUG upload_otros_multiple: Error al eliminar archivo: {remove_error}")
            except Exception as func_error:
                print(f"DEBUG upload_otros_multiple: Excepción en sql_add_otros_documento: {func_error}")
                flash(f'Error al procesar documento: {str(func_error)}', 'error')
                # Eliminar archivo si falla la función
                try:
                    os.remove(upload_path)
                except:
                    pass
        else:
            flash('Debe seleccionar un archivo y proporcionar un nombre', 'error')
        
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))

@app.route('/download_otros/<string:id>/<string:filename>', methods=['GET'])
def download_otros(id, filename):
    """Descargar documento específico de OTROS"""
    if 'conectado' not in session:
        flash('Primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    
    # Verificar que el archivo existe
    file_path = get_otros_document_path(id, filename)
    if not path.exists(file_path):
        flash('El archivo no existe o ha sido eliminado', 'error')
        return redirect(url_for('lista_tbl_docie', id=id))
    
    # Verificar que el archivo pertenece realmente a este código modular y está en la lista OTROS
    otros_docs = sql_get_otros_documentos(id)
    filename_found = any(doc.get('filename') == filename for doc in otros_docs)
    
    if not filename_found:
        flash('El archivo no corresponde a los documentos OTROS de este código modular', 'error')
        return redirect(url_for('lista_tbl_docie', id=id))
    
    # Enviar archivo para descarga
    try:
        return send_file(file_path, as_attachment=True)
    except Exception as e:
        flash(f'Error al descargar el archivo: {str(e)}', 'error')
        return redirect(url_for('lista_tbl_docie', id=id))

@app.route('/delete_otros/<string:id>/<string:doc_id>', methods=['POST'])
def delete_otros(id, doc_id):
    """Eliminar documento específico de OTROS"""
    if 'conectado' not in session:
        flash('Primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    
    # Obtener nombre del archivo antes de eliminar
    filename_to_delete = sql_delete_otros_documento(id, doc_id)
    
    if filename_to_delete:
        # Eliminar archivo físico
        file_path = get_otros_document_path(id, filename_to_delete)
        try:
            if path.exists(file_path):
                os.remove(file_path)
                flash('Documento eliminado correctamente!', 'success')
            else:
                flash('Documento eliminado de la lista (archivo no encontrado)', 'warning')
        except Exception as e:
            flash(f'Error al eliminar archivo físico: {str(e)}', 'error')
    else:
        flash('No se pudo encontrar el documento para eliminar', 'error')
    
    return redirect(url_for('lista_tbl_docie', id=id))

@app.route('/get_otros_list/<string:id>', methods=['GET'])
def get_otros_list(id):
    """Obtener lista JSON de documentos OTROS para actualizaciones AJAX"""
    if 'conectado' not in session:
        return jsonify({'error': 'No autorizado'}), 401
    
    try:
        otros_docs = sql_get_otros_documentos(id)
        return jsonify({'documentos': otros_docs})
    except Exception as e:
        return jsonify({'error': str(e)}), 500


@app.route('/upload_rd_comite/<string:id>', methods=['POST'])
def upload_rd_comite(id):
    if 'conectado' in session:
        if 'archivo' in request.files:
            file = request.files['archivo']
            if file.filename != '':
                # Validar tamaño del archivo
                is_valid, error_msg = validate_file_size(file)
                if not is_valid:
                    flash(error_msg, 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                
                filename = secure_filename(file.filename)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension
                upload_dir = f'/var/www/my-app/static/tbl_docie/{id}/'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
                # Update DB
                with connectionBD() as conn:
                    with conn.cursor() as cursor:
                        cursor.execute("UPDATE tbl_docie SET rd_comite = %s WHERE codmodular = %s", (nuevoNombreFile, id))
                        conn.commit()
                flash('RD Comite cargado correctamente!', 'success')
        return redirect(url_for('lista_tbl_docie', id=id))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    
@app.route('/lista-de-profesores/<string:id>', methods=['GET'])
def lista_profesores(id):
    if 'conectado' in session:
        return render_template(f'{PATH_URL}/lista_profesores.html', profesores=sql_lista_profesoresBD(id), codmodular=id)
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))

@app.route('/generar-reporte-profesores/<string:id>', methods=['GET'])
def generar_reporte_profesores(id):
    if 'conectado' not in session:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    
    if session.get('admin') != 1:
        flash('Acceso denegado. Solo administradores.', 'error')
        return redirect(url_for('lista_profesores', id=id))
    
    # Redirect to new dashboard
    return redirect(url_for('admin_reporte_profesores_dashboard', codmodular=id))

#Funcion que recorre todos los archivos almacenados en la carpeta (archivos)
def listaArchivos(id):
    #urlFiles = 'static/archivos'
    PATH_URL = ('/var/www/my-app/static/tbl_docie/')
    urlFiles = os.path.join(PATH_URL, str(id))

    # Create directory if it doesn't exist
    if not os.path.exists(urlFiles):
        os.makedirs(urlFiles)

    return (os.listdir(urlFiles))


@app.route('/guardar-foto', methods=['GET', 'POST'])
def registarArchivo():
        if request.method == 'POST':
            if(request.files['archivo']):
                #Script para archivo
                file     = request.files['archivo']
                basepath = (__file__) #La ruta donde se encuentra el archivo actual
                filename = secure_filename(file.filename) #Nombre original del archivo
                
                # Capturing the file extension (e.g., .png, .jpg, .pdf, etc.)
                extension = path.splitext(filename)[1]
                nuevoNombreFile = uuid.uuid4().hex + extension

            # Ensure the upload directory exists
                upload_dir = 'static/fotos_empleados'
                if not os.path.exists(upload_dir):
                    os.makedirs(upload_dir)

            # Construct the upload path
                upload_path = os.path.join(upload_dir, nuevoNombreFile)
                try:
                    file.save(upload_path)
                except Exception as e:
                    flash(f'Error al guardar el archivo: {str(e)}', 'error')
                    return redirect(url_for('registarArchivo'))

                flash('Archivo cargado correctamente!', 'success')
        return render_template(f'{PATH_URL}/lista_colegios.html', list_ie = listaArchivos(id))
    

@app.route('/eliminar/<string:id>/<string:nombreFoto>', methods=['GET','POST'])
def EliminarFoto(id, nombreFoto=''):
    if request.method == 'GET':
        basepath = path.dirname (__file__)
        url_File = os.path.join(f'/var/www/my-app/static/tbl_docie/{id}/', nombreFoto)


        if path.exists(url_File):
            remove(url_File)

            # Update DB to clear the specific filename
            with connectionBD() as conn:
                with conn.cursor() as cursor:

                    # First, find which field has this filename
                    cursor.execute("SELECT horario, horario_estudiante, pci, rd_comite, ri, pat, pei FROM tbl_docie WHERE codmodular = %s", (id,))
                    row = cursor.fetchone()
                    if row:
                        if row[0] == nombreFoto:  # horario
                            cursor.execute("UPDATE tbl_docie SET horario = NULL WHERE codmodular = %s", (id,))
                        elif row[1] == nombreFoto:  # horario_estudiante
                            cursor.execute("UPDATE tbl_docie SET horario_estudiante = NULL WHERE codmodular = %s", (id,))
                        elif row[2] == nombreFoto:  # pci
                            cursor.execute("UPDATE tbl_docie SET pci = NULL WHERE codmodular = %s", (id,))
                        elif row[3] == nombreFoto:  # rd_comite
                            cursor.execute("UPDATE tbl_docie SET rd_comite = NULL WHERE codmodular = %s", (id,))
                        elif row[4] == nombreFoto:  # ri
                            cursor.execute("UPDATE tbl_docie SET ri = NULL WHERE codmodular = %s", (id,))
                        elif row[5] == nombreFoto:  # pat
                            cursor.execute("UPDATE tbl_docie SET pat = NULL WHERE codmodular = %s", (id,))
                        elif row[6] == nombreFoto:  # pei
                            cursor.execute("UPDATE tbl_docie SET pei = NULL WHERE codmodular = %s", (id,))
                        # Los documentos OTROS múltiples se manejan por separado con delete_otros
                    conn.commit()
    info = sql_detalles_ieBD(id)
    documentos = [info] if info else []
    codmodular = id
    return render_template(f'{PATH_URL}/lista_colegios.html', documentos=documentos, codmodular=codmodular, info=info)
            


@app.route('/descargar/<string:id>/<string:nombreFoto>', methods=['GET','POST'])
def descargar_Archivo(id, nombreFoto=''):
    basepath = path.dirname (__file__)
    url_File = os.path.join(f'/var/www/my-app/static/tbl_docie/{id}/', nombreFoto)
    
    # Verificar que el archivo existe antes de intentar descargarlo
    if not path.exists(url_File):
        flash('El archivo no existe o ha sido eliminado', 'error')
        return redirect(url_for('lista_tbl_docie', id=id))
    

    # Verificar que el archivo pertenece realmente a este código modular
    with connectionBD() as conn:
        with conn.cursor() as cursor:

            cursor.execute("SELECT horario, horario_estudiante, pci, rd_comite, ri, pat, pei FROM tbl_docie WHERE codmodular = %s", (id,))
            row = cursor.fetchone()
            if row:
                archivos_validos = [archivo for archivo in row if archivo]
                if nombreFoto not in archivos_validos:
                    flash('El archivo no corresponde a este código modular', 'error')
                    return redirect(url_for('lista_tbl_docie', id=id))
    
    #send_file toma 2 parametros, el primero será la ruta del archivo y el
    # 2 será as_attachment=True porque deseamos que el archivo sea descargable.
    resp = send_file(url_File, as_attachment=True)
    return resp

@app.route("/detalles-ie/<int:ie>", methods=['GET'])
def detalleie(ie=None):
    if 'conectado' in session:
        # Verificamos si el parámetro ie es None o no está presente en la URL
        if ie is None:
            return redirect(url_for('inicio'))
        else:
            detalle_ie = sql_detalles_ieBD(ie) or []
            return render_template(f'{PATH_URL}/form_ie_update.html', detalle_ie=detalle_ie)
    else:
        flash('Primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    
@app.route('/actualizar-ie', methods=['POST'])
def actualizarIE():
    resultData = procesar_actualizacionie_form(request)
    if resultData:
        return redirect(url_for('lista_ie'))
    
    
@app.route("/editar-ie/<int:id>", methods=['GET','POST'])
def viewEditarIE(id):
    if 'conectado' in session:
        respuestaIE = buscarIEUnico(id)
        if respuestaIE:
            return render_template(f'{PATH_URL}/form_ie_update.html', respuestaIE=respuestaIE)
        else:
            flash('El empleado no existe.', 'error')
            return redirect(url_for('inicio'))
    else:
        flash('Primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))


@app.route('/doc-profesores/<int:dniprof>', methods=['GET','POST'])
def doc_profesores(dniprof):
    if 'conectado' not in session:
        flash('Primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))

    if request.method == 'POST':
        if 'documento' not in request.files:
            flash('No se seleccionó ningún archivo', 'error')
            return redirect(request.url)

        file = request.files['documento']
        if file.filename == '':
            flash('No se seleccionó ningún archivo', 'error')
            return redirect(request.url)

        if file and allowed_file(file.filename):
            # Validar tamaño del archivo
            is_valid, error_msg = validate_file_size(file)
            if not is_valid:
                flash(error_msg, 'error')
                return redirect(request.url)
            
            filename = secure_filename(file.filename)
            filepath = os.path.join(UPLOAD_FOLDER, filename)
            # Ensure the upload directory exists
            os.makedirs(UPLOAD_FOLDER, exist_ok=True)
            try:
                file.save(filepath)
            except Exception as e:
                flash(f'Error al guardar el archivo: {str(e)}', 'error')
                return redirect(request.url)

            #tipo_doc = request.form.get('tipo_doc')
            curso = request.form.get('curso', '').strip()
            dniprof = dniprof
            sesion = request.form.get('sesion', '').strip()
            mes = request.form.get('mes', '').strip()
            #codmodular = request.form.get('codmodular', '').strip()
            tipo_doc = request.form.get('tipo_doc', 'Otro').strip()
            trimestre = request.form.get('trimestre', '').strip() 
            if not all([curso, tipo_doc]):
                flash('Todos los campos (curso, tipo_doc) son requeridos', 'error')
                os.remove(filepath)
                return redirect(request.url)
            if subir_documento_profesor(dniprof, filename, curso, sesion, mes, trimestre, tipo_doc, file):
                flash('Documento subido correctamente', 'success')
            else:
                flash('Error al subir documento', 'error')
                os.remove(filepath)
        else:
            flash('Tipo de archivo no permitido', 'error')

    documentos = sql_doc_profesoresBD(dniprof)
    profesor = sql_profesorBD(dniprof)
    print(f"DEBUG: profesor data fetched for dni {dniprof}: {profesor}")
    return render_template(f'{PATH_URL}/documentos_profesores.html',
                            dniprof=dniprof,
                            documentos=documentos,
                            profesor=profesor)

@app.route('/delete-doc-profesor/<int:dniprof>/<int:iddoc>', methods=['POST'])
def delete_doc_profesor(dniprof, iddoc):
    if 'conectado' not in session:
        flash('Primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    
    filename = eliminar_documento_profesor(dniprof, iddoc)
    
    if filename:
        file_path = os.path.join(UPLOAD_FOLDER, filename)
        try:
            if os.path.exists(file_path):
                os.remove(file_path)
                flash('Documento eliminado correctamente!', 'success')
            else:
                flash('Documento eliminado de BD (archivo no encontrado)', 'warning')
        except Exception as e:
            flash(f'Error al eliminar archivo físico: {str(e)}', 'error')
    else:
        flash('No se pudo eliminar el documento', 'error')
    
    return redirect(url_for('doc_profesores', dniprof=dniprof))
