import os
import uuid
from werkzeug.utils import secure_filename
from conexion.conexionBD import connectionBD
from datetime import datetime
from pathlib import Path

UPLOAD_FOLDER = 'static/docprof'
ALLOWED_EXTENSIONS = {'pdf', 'docx', 'xlsx', 'jpg', 'png'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

def sql_profesorBD(dniprof):
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                querySQL = """
                    SELECT apaterno, amaterno, nombres
                    FROM profesor
                    WHERE dniprof = %s
                """
                cursor.execute(querySQL, (dniprof,))
                profesor = cursor.fetchone()
                return profesor
    except Exception as e:
        print(f"Error en sql_profesorBD: {e}")
        return None

def sql_doc_profesoresBD(dniprof):
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                querySQL = """
                    SELECT iddoc, dniprof, curso, sesion, mes,
                           trimestre, archivo,
                           fechasubida, tipo_doc
                    FROM tbl_docprof
                    WHERE dniprof = %s
                    ORDER BY fechasubida DESC
                    LIMIT 100
                """
                cursor.execute(querySQL, (dniprof,))
                documentos = cursor.fetchall()
                return documentos
    except Exception as e:
        print(f"Error en list_docie: {e}")
        return []

def obtener_establecimiento_por_codmodular(codmodular):
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                sql = "SELECT establecimiento FROM iiee WHERE codmodular = %s LIMIT 1"
                cursor.execute(sql, (codmodular,))
                result = cursor.fetchone()
                if result:
                    return result.get('establecimiento')
                else:
                    return None
    except Exception as e:
        print(f'Error al obtener establecimiento: {str(e)}')
        return None


def insertar_profesor(data_form, codmodular):
    try:
        establecimiento = obtener_establecimiento_por_codmodular(codmodular)
        if establecimiento is None:
            print('No se encontró establecimiento para el codmodular dado')
            return False

        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                sql = "INSERT INTO profesor (dniprof, apaterno, amaterno, nombres, codmodular, establecimiento) VALUES (%s, %s, %s, %s, %s, %s)"
                valores = (data_form['dniprof'], data_form['apaterno'], data_form['amaterno'], data_form['nombres'], codmodular, establecimiento)
                cursor.execute(sql, valores)
                conexion_MySQLdb.commit()
                resultado_insert = cursor.rowcount
                return resultado_insert
    except Exception as e:
        print(f'Error al insertar profesor: {str(e)}')
        return False



def subir_documento_profesor(dni, filename, curso, sesion, mes, trimestre, tipo_doc, file_content=None):
    """
    Función para subir documento de profesor con validación de tamaño
    file_content: opcional, contenido del archivo para validar tamaño
    """
    try:
        # Validar tamaño del archivo si se proporciona el contenido
        if file_content:
            file_size = len(file_content.read())
            file_content.seek(0)  # Volver al inicio
            
            max_size_bytes = 200 * 1024 * 1024  # 200MB
            if file_size > max_size_bytes:
                raise ValueError(f"El archivo es demasiado grande. Tamaño actual: {file_size / (1024*1024):.2f}MB. Tamaño máximo permitido: 200MB")
        
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor() as cursor:
                querySQL = """
                    INSERT INTO tbl_docprof
                    ( dniprof, archivo, curso, sesion, mes, trimestre, tipo_doc)
                    VALUES (%s, %s, %s, %s, %s, %s, %s)
                """
                cursor.execute(querySQL,
                (dni, filename, curso, sesion, mes, trimestre, tipo_doc))
                conexion_MySQLdb.commit()
                return True
    except ValueError as ve:
        print(f"Error de validación en documento: {ve}")
        raise ve
    except Exception as e:
        print(f"Error al subir documento: {e}")
        return False




def eliminar_documento_profesor(dniprof, iddoc):
    """
    Elimina documento de profesor y retorna el nombre del archivo eliminado
    """
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                # Obtener nombre del archivo
                cursor.execute(
                    "SELECT archivo FROM tbl_docprof WHERE iddoc = %s AND dniprof = %s", 
                    (iddoc, dniprof)
                )
                result = cursor.fetchone()
                if not result:
                    print(f"No se encontró documento iddoc={iddoc} para dniprof={dniprof}")
                    return None
                
                filename = result['archivo']
                
                # Eliminar de BD
                cursor.execute(
                    "DELETE FROM tbl_docprof WHERE iddoc = %s AND dniprof = %s", 
                    (iddoc, dniprof)
                )
                conexion_MySQLdb.commit()
                
                print(f"Documento eliminado: {filename}")
                return filename
    except Exception as e:
        print(f"Error al eliminar documento profesor {iddoc}: {e}")
        return None


def sql_lista_profesores_con_estadisticasBD(codmodular):
    """Lista profesores con estadísticas de documentos por trimestre para un codmodular"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                query = """
                    SELECT 
                        p.dniprof, p.apaterno, p.amaterno, p.nombres,
                        COUNT(d.iddoc) as total_documentos,
                        SUM(CASE WHEN d.trimestre = 'I' THEN 1 ELSE 0 END) as trimestre1,
                        SUM(CASE WHEN d.trimestre = 'II' THEN 1 ELSE 0 END) as trimestre2,
                        SUM(CASE WHEN d.trimestre = 'III' THEN 1 ELSE 0 END) as trimestre3,
                        SUM(CASE WHEN d.trimestre = 'IV' THEN 1 ELSE 0 END) as trimestre4
                    FROM profesor p 
                    LEFT JOIN tbl_docprof d ON p.dniprof = d.dniprof 
                    WHERE p.codmodular = %s
                    GROUP BY p.dniprof, p.apaterno, p.amaterno, p.nombres
                    ORDER BY p.apaterno
                """
                cursor.execute(query, (codmodular,))
                return cursor.fetchall()
    except Exception as e:
        print(f"Error en sql_lista_profesores_con_estadisticasBD: {e}")
        return []


def sql_stats_documentos_por_tipoBD(codmodular):
    """Estadísticas de documentos por tipo para un codmodular"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                query = """
                    SELECT 
                        tipo_doc, 
                        COUNT(*) as cantidad,
                        COUNT(DISTINCT dniprof) as profesores_con_tipo
                    FROM tbl_docprof d
                    JOIN profesor p ON d.dniprof = p.dniprof
                    WHERE p.codmodular = %s
                    GROUP BY tipo_doc
                    ORDER BY cantidad DESC
                """
                cursor.execute(query, (codmodular,))
                return cursor.fetchall()
    except Exception as e:
        print(f"Error en sql_stats_documentos_por_tipoBD: {e}")
        return []


def sql_todos_documentos_profesoresBD(codmodular):
    """Todos los documentos de profesores de un codmodular"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                query = """
                    SELECT p.dniprof, p.nombres, p.apaterno, p.amaterno,
                           d.iddoc, d.archivo, d.curso, d.sesion, d.mes, d.trimestre, d.fechasubida, d.tipo_doc
                    FROM tbl_docprof d
                    JOIN profesor p ON d.dniprof = p.dniprof
                    WHERE p.codmodular = %s
                    ORDER BY p.apaterno, d.fechasubida DESC
                """
                cursor.execute(query, (codmodular,))
                return cursor.fetchall()
    except Exception as e:
        print(f"Error en sql_todos_documentos_profesoresBD: {e}")
        return []


def sql_stats_documentos_prof_dniBD(dniprof):
    """Estadísticas de documentos para un profesor específico por DNI"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                query = """
                    SELECT 
                        trimestre,
                        tipo_doc,
                        COUNT(*) as cantidad
                    FROM tbl_docprof 
                    WHERE dniprof = %s
                    GROUP BY trimestre, tipo_doc
                    ORDER BY trimestre, tipo_doc
                """
                cursor.execute(query, (dniprof,))
                return cursor.fetchall()
    except Exception as e:
        print(f"Error en sql_stats_documentos_prof_dniBD: {e}")
        return []


def sql_documentos_prof_dniBD(dniprof):
    """Documentos de un profesor específico por DNI"""
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                query = """
                    SELECT iddoc, archivo, curso, sesion, mes, trimestre, fechasubida, tipo_doc
                    FROM tbl_docprof 
                    WHERE dniprof = %s
                    ORDER BY fechasubida DESC
                """
                cursor.execute(query, (dniprof,))
                return cursor.fetchall()
    except Exception as e:
        print(f"Error en sql_documentos_prof_dniBD: {e}")
        return []

