# dbviewer/views.py
from django.shortcuts import render, redirect
from django.contrib import messages
from django.conf import settings
import mysql.connector
from mysql.connector import Error
from datetime import date
from .forms import LoginForm

# --- Helper para conectar a BDs dinámicas ---
def conectar_db_dinamica(db_config):
    conn = None
    cursor = None
    try:
        # print(f"DEBUG DJANGO: Intentando conectar a: {db_config}")
        conn = mysql.connector.connect(
            host=db_config['host'],
            user=db_config['user'],
            password=db_config['password'],
            database=db_config['database'],
            port=db_config.get('port', 3306) # Puerto por defecto si no se especifica
        )
        cursor = conn.cursor(dictionary=True)
        # print(f"DEBUG DJANGO: Conectado a {db_config['database']}")
        return conn, cursor
    except Error as e:
        # print(f"DEBUG DJANGO: Error conectando a {db_config.get('database')}: {e}")
        messages.error(None, f"Error al conectar a la base de datos '{db_config.get('database')}': {e}")
        if conn: conn.close()
    return None, None

# --- Vista de Login ---
def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            app_login = form.cleaned_data['app_login']
            app_password = form.cleaned_data['app_password']

            asesoft_config = {
                'host': settings.ASESOFT_DB_HOST,
                'user': settings.ASESOFT_DB_USER,
                'password': settings.ASESOFT_DB_PASSWORD,
                'database': settings.ASESOFT_DB_NAME,
                'port': settings.ASESOFT_DB_PORT,
            }
            
            conn_asesoft, cursor_asesoft = conectar_db_dinamica(asesoft_config)

            if not conn_asesoft or not cursor_asesoft:
                messages.error(request, "Error crítico: No se pudo conectar al sistema de autenticación (asesoft).")
                return render(request, 'dbviewer/login.html', {'form': form})

            try:
                query = """
                    SELECT login, userpass, servername, dbname, username, password, fin_acceso
                    FROM usuarios
                    WHERE login = %s
                """
                cursor_asesoft.execute(query, (app_login,))
                user_data = cursor_asesoft.fetchone()

                if user_data and user_data['userpass'] == app_password:
                    if user_data['fin_acceso'] is None or user_data['fin_acceso'] >= date.today():
                        # Autenticación exitosa
                        # Guardar información de la BD destino en la sesión de Django
                        
                        db_destino_host = user_data['servername']
                        db_destino_port = 3306 # Default
                        if db_destino_host and ':' in db_destino_host:
                            parts = db_destino_host.split(':',1)
                            db_destino_host = parts[0]
                            if len(parts) > 1 and parts[1].isdigit():
                                db_destino_port = int(parts[1])

                        request.session['db_destino_config'] = {
                            'host': db_destino_host,
                            'user': user_data['username'],
                            'password': user_data['password'], # ¡Considerar seguridad de esto en sesión!
                            'database': user_data['dbname'],
                            'port': db_destino_port
                        }
                        request.session['app_user_login'] = app_login # Para mostrar quién está logueado
                        
                        messages.success(request, f"Bienvenido, {app_login}!")
                        return redirect('dbviewer:mostrar_tabla_usuarios')
                    else:
                        messages.error(request, "Tu acceso ha expirado.")
                else:
                    messages.error(request, "Login o contraseña incorrectos.")
            except Error as e:
                messages.error(request, f"Error durante la autenticación: {e}")
            finally:
                if cursor_asesoft: cursor_asesoft.close()
                if conn_asesoft: conn_asesoft.close()
        else:
            messages.error(request, "Formulario inválido.")
    else:
        form = LoginForm()
    
    return render(request, 'dbviewer/login.html', {'form': form})

# --- Vista para mostrar la tabla de usuarios de la BD destino ---
def mostrar_tabla_usuarios_view(request):
    # Verificar si el usuario está "logueado" (tiene config en sesión)
    db_destino_config = request.session.get('db_destino_config')
    if not db_destino_config:
        messages.warning(request, "Por favor, inicia sesión primero.")
        return redirect('dbviewer:login') # Nombre de la URL de login

    conn_destino, cursor_destino = conectar_db_dinamica(db_destino_config)

    if not conn_destino or not cursor_destino:
        # El error ya se habrá añadido por conectar_db_dinamica
        # Podrías querer limpiar la sesión aquí si la conexión falla repetidamente
        # del request.session['db_destino_config']
        return render(request, 'dbviewer/mostrar_tabla.html', {'error_conexion': True, 'db_name': db_destino_config.get('database')})

    registros = []
    column_names = []
    error_consulta = None
    target_table_name = "usuarios" # Asumir
    
    try:
        cursor_destino.execute(f"SELECT * FROM {target_table_name}")
        registros = cursor_destino.fetchall()
        if registros:
            column_names = list(registros[0].keys())
        elif cursor_destino.description: # Si no hay filas pero sí descripción de columnas
             column_names = [col[0] for col in cursor_destino.description]

    except Error as e:
        error_consulta = f"Error al consultar la tabla '{target_table_name}': {e}"
        if e.errno == 1146: # Table doesn't exist
            error_consulta = f"La tabla '{target_table_name}' no existe en la base de datos '{db_destino_config.get('database')}'."
        elif e.errno == 1142: # Access denied for table
             error_consulta = f"El usuario '{db_destino_config.get('user')}' no tiene permisos para la tabla '{target_table_name}'."

        messages.error(request, error_consulta)
    finally:
        if cursor_destino: cursor_destino.close()
        if conn_destino: conn_destino.close()
        
    app_user_login = request.session.get('app_user_login', 'Usuario')

    context = {
        'registros': registros,
        'column_names': column_names,
        'db_name': db_destino_config.get('database'),
        'db_host': db_destino_config.get('host'),
        'app_user_login': app_user_login,
        'error_consulta': error_consulta,
        'target_table_name': target_table_name,
    }
    return render(request, 'dbviewer/mostrar_tabla.html', context)

# --- Vista de Logout ---
def logout_view(request):
    # Limpiar la configuración de la BD destino de la sesión
    if 'db_destino_config' in request.session:
        del request.session['db_destino_config']
    if 'app_user_login' in request.session:
        del request.session['app_user_login']
    
    # También puedes usar auth.logout(request) si estuvieras usando el sistema de auth de Django para este usuario
    messages.info(request, "Has cerrado sesión.")
    return redirect('dbviewer:login')