from django.shortcuts import render, redirect
from django.conf import settings
from django.views.decorators.http import require_POST
import os
import re
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from usuarios.models import Solicitud, PermisoArea, PermisoUrl

from login.models import Usuario

# Create your views here.
def solicitudes_view(request):
    if 'user_id' not in request.session or request.session.get('user_tipo') == 3:
        # Redirigir al login si no hay sesión
        return redirect('/')

    return render(request, 'solicitudes.html')


@csrf_exempt
def get_solicitudes_data(request):
    user_id = request.session.get('user_id')
    try:
        usuario = Usuario.objects.get(id=user_id)
    except Usuario.DoesNotExist:
        return JsonResponse({"result": [], "count": 0, "error": "Usuario no encontrado"}, status=404)

    if usuario.tipo == 2:
        solicitudes_list = Solicitud.objects.select_related(
            'usuario', 'solicitud_area', 'solicitud_url'
        ).filter(solicitud_area=usuario.area)
    else:
        solicitudes_list = Solicitud.objects.select_related(
            'usuario', 'solicitud_area', 'solicitud_url'
        ).all()

    data = [
        {
            "id": s.id,
            "usuario": s.usuario.nombre,
            "solicitud_area": s.solicitud_area.nombre,
            "solicitud_url": s.solicitud_url.nombre,
            "justificacion": s.justificacion,
            "estado": s.estado,
        }
        for s in solicitudes_list
    ]

    return JsonResponse({"result": data, "count": len(data)})

@require_POST
@csrf_exempt
def update_solicitud_status(request):
    try:
        data = json.loads(request.body)
        solicitud_id = data.get('id')
        new_status_str = data.get('estado')

        if solicitud_id is None or new_status_str is None:
            return JsonResponse({'status': 'error', 'message': 'ID and status are required.'}, status=400)

        new_status = int(new_status_str)

        solicitud = Solicitud.objects.get(id=solicitud_id)

        if solicitud.estado != 2:
            return JsonResponse({'status': 'error', 'message': 'Esta solicitud ya ha sido gestionada.'}, status=409)

        solicitud.estado = new_status
        solicitud.save()

        # Si la solicitud se aprueba (estado = 1), crear o actualizar los permisos correspondientes
        if new_status == 1:
            # Crear o actualizar PermisoArea (si existe con estado 0, se actualiza a 1)
            permiso_area, created_area = PermisoArea.objects.get_or_create(
                usuario_id=solicitud.usuario.id,
                area_id=solicitud.solicitud_area.id,
                defaults={'estado': 1}
            )
            # Si ya existía (incluso con estado 0), actualizar el estado a 1
            if not created_area:
                permiso_area.estado = 1
                permiso_area.save()

            # Crear o actualizar PermisoUrl (si existe con estado 0, se actualiza a 1)
            permiso_url, created_url = PermisoUrl.objects.get_or_create(
                usuario_id=solicitud.usuario.id,
                url_id=solicitud.solicitud_url.id,
                defaults={'estado': 1}
            )
            # Si ya existía (incluso con estado 0), actualizar el estado a 1
            if not created_url:
                permiso_url.estado = 1
                permiso_url.save()

        return JsonResponse({'status': 'success', 'message': 'Status updated successfully.'})
    except Solicitud.DoesNotExist:
        return JsonResponse({'status': 'error', 'message': 'Solicitud not found.'}, status=404)
    except Exception as e:
        return JsonResponse({'status': 'error', 'message': str(e)}, status=500)

def get_pending_solicitudes_count(request):
    if 'user_id' not in request.session:
        return JsonResponse({'count': 0}, status=401) # Unauthorized

    user_id = request.session['user_id']
    try:
        user = Usuario.objects.get(id=user_id)
        if user.tipo == 2:
            pending_count = Solicitud.objects.filter(estado=2, solicitud_area=user.area).count()
        else:
            pending_count = Solicitud.objects.filter(estado=2).count()
        return JsonResponse({'count': pending_count})
    except Usuario.DoesNotExist:
        return JsonResponse({'count': 0}, status=404)
    except Exception as e:
        return JsonResponse({'error': str(e)}, status=500)