from django.http import JsonResponse
from .acciones import Admin
import logging
import json
from django.views.decorators.csrf import csrf_exempt

from django.utils import timezone
from .models import Log 


logger = logging.getLogger(__name__)

def status_view(request):
    # BLOQUE 1: Log de iniciación
    logger.info("INICIO - Ejecutando Health Check de Administración.")

    # BLOQUE 2: Limpieza y validación de datos
    # Para un status simple, el diccionario de limpieza está vacío
    data_cleaned = {}

    # BLOQUE 3: Llamada a la acción
    try:
        # Instanciamos la clase Admin y llamamos al método
        admin_logic = Admin()
        response_data = admin_logic.get_status_action()
        status_code = 200
    except Exception as e:
        logger.error(f"ERROR - Fallo en get_status_action: {str(e)}")
        response_data = {"status": "error", "message": "Internal Server Error"}
        status_code = 500

    # BLOQUE 4: Log de cierre y retorno
    logger.info(f"FIN - Health Check completado. Status: {status_code}")
    return JsonResponse(response_data, status=status_code)

@csrf_exempt
@staticmethod
def api_token(request):
    """
    Endpoint: api/token/
    Patrón: 4 bloques con persistencia en Log DB.
    """
    # --- BLOQUE 1: LOG INITIATION ---
    logger.info("INICIO - Petición de JWT (api/token/)")
    
    # Iniciamos el registro en la base de datos (Estándar compañeros)
    log_entry = Log.objects.create(
        user='anonimo',
        path='api/token/',
        method='POST',
        createdAt=timezone.now(),
        status_code='0'
    )

    try:
        if request.method == 'POST':
            # --- BLOQUE 2: DATA CLEANING ---
            body_data = json.loads(request.body)
            log_entry.request = body_data # Guardamos lo que entró
            log_entry.save()

            params = {
                'username': body_data.get('username'),
                'password': body_data.get('password')
            }

            # --- BLOQUE 3: ACTION CALL ---
            admin_logic = Admin()
            resultado = admin_logic.obtener_token_action(params)

            # --- BLOQUE 4: LOG CLOSURE & RESPONSE ---
            if resultado:
                status = 200
                log_entry.user = resultado['user']
                log_entry.response = resultado
                log_entry.status_code = str(status)
                log_entry.updatedAt = timezone.now()
                log_entry.save()
                
                logger.info(f"FIN - JWT generado para: {log_entry.user}")
                return JsonResponse(resultado, status=status)
            else:
                status = 401
                response_error = {"error": "Credenciales inválidas"}
                log_entry.status_code = str(status)
                log_entry.response = response_error
                log_entry.save()
                return JsonResponse(response_error, status=status)

    except Exception as e:
        logger.error(f"ERROR CRÍTICO en api_token: {str(e)}")
        log_entry.status_code = '500'
        log_entry.response = {'error': str(e)}
        log_entry.save()
        return JsonResponse({'error': 'Error interno'}, status=500)