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, Url, PermisoUrl, PermisoArea

from login.models import Usuario

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

    url_id = request.GET.get('url_id')
    if not url_id:
        return redirect('/perfil')

    try:
        url = Url.objects.get(id=url_id)
        user_id = request.session.get('user_id')
        
        # Verificar si el usuario tiene PermisoUrl activo (estado=1)
        has_permiso_url = PermisoUrl.objects.filter(
            usuario_id=user_id,
            url_id=url_id,
            estado=1
        ).exists()
        
        # Verificar si el usuario tiene PermisoArea activo (estado=1)
        has_permiso_area = PermisoArea.objects.filter(
            usuario_id=user_id,
            area_id=url.area.id,
            estado=1
        ).exists()
        
        # Se requiere solo PermisoUrl con estado=1
        has_permissions = has_permiso_url
        responsables = Usuario.objects.filter(tipo__in=[1, 2])
        responsables_nombres = [r.nombre for r in responsables]

        is_area_18 = (url.area.id == 18)
        context = {
            'url_data': url,
            'responsables': ", ".join(responsables_nombres),
            'is_area_18': is_area_18,
            'has_permissions': has_permissions
        }
        return render(request, 'informe_content.html', context)
    except Url.DoesNotExist:
        # Manejar el caso en que la URL no se encuentra
        return redirect('/perfil')  # O a una página de error

def informe_content_view(request):
    if 'user_id' not in request.session:
        return JsonResponse({'error': 'Not logged in'}, status=401)

    url_id = request.GET.get('url_id')
    if not url_id:
        return JsonResponse({'error': 'Missing url_id'}, status=400)

    try:
        url = Url.objects.get(id=url_id)
        user_id = request.session.get('user_id')
        
        # Verificar si el usuario tiene PermisoUrl activo (estado=1)
        has_permiso_url = PermisoUrl.objects.filter(
            usuario_id=user_id,
            url_id=url_id,
            estado=1
        ).exists()
        
        # Verificar si el usuario tiene PermisoArea activo (estado=1)
        has_permiso_area = PermisoArea.objects.filter(
            usuario_id=user_id,
            area_id=url.area.id,
            estado=1
        ).exists()
        
        # Se requiere solo PermisoUrl con estado=1
        has_permissions = has_permiso_url
        
        is_area_18 = (url.area.id == 18)
        
        responsables_str = ""
        if not is_area_18:
            # Filtra usuarios que son admin (2) o vip (1)
            responsables_qs = Usuario.objects.filter(tipo__in=[0, 2])
            responsables_nombres = [r.nombre for r in responsables_qs]
            responsables_str = ", ".join(responsables_nombres)

        context = {
            'url_data': url,
            'is_area_18': is_area_18,
            'responsables': responsables_str,
            'has_permissions': has_permissions
        }
        return render(request, 'informe_content.html', context)
    except Url.DoesNotExist:
        return JsonResponse({'error': 'URL not found'}, status=404)

@csrf_exempt
@require_POST
def solicitar_informe(request):
    try:
        data = json.loads(request.body)
        url_id = data.get('url_id')
        area_id = data.get('area_id')
        user_id = data.get('user_id')
        justificacion = data.get('justificacion')

        justificacion = data.get('justificacion', '') # Make justificacion optional

        if not all([url_id, area_id, user_id]):
            return JsonResponse({'success': False, 'message': 'Faltan datos requeridos en la solicitud'}, status=400)

        # Check for existing pending requests
        existing_solicitud = Solicitud.objects.filter(
            solicitud_url_id=url_id,
            solicitud_area_id=area_id,
            usuario_id=user_id,
            estado=2  # Estado Pendiente
        ).first()

        if existing_solicitud:
            return JsonResponse({'success': False, 'message': 'Ya existe una solicitud pendiente para este informe.'}, status=409) # 409 Conflict

        solicitud = Solicitud.objects.create(
            solicitud_url_id=url_id,
            solicitud_area_id=area_id,
            usuario_id=user_id,
            justificacion=justificacion,
            estado=2  # Pendiente
        )
        return JsonResponse({'success': True, 'message': 'Solicitud enviada correctamente'}, status=201)

    except json.JSONDecodeError:
        return JsonResponse({'success': False, 'message': 'JSON inválido'}, status=400)
    except Exception as e:
        return JsonResponse({'success': False, 'message': str(e)}, status=500)
