from django.shortcuts import render, redirect
from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth.hashers import make_password
from django.core.paginator import Paginator
import os
from PIL import Image
from login.models import Usuario
from usuarios.models import Solicitud, PermisoUrl, Url


def _get_profile_url(img_filename):
    """Devuelve la URL de la imagen de perfil del usuario."""
    if not img_filename:
        return f"{settings.MEDIA_URL}profile/default.png"
    img_path = os.path.join(settings.MEDIA_ROOT, 'profile', img_filename)
    if os.path.exists(img_path):
        return f"{settings.MEDIA_URL}profile/{img_filename}"
    return f"{settings.MEDIA_URL}profile/default.png"


def _update_password(request, user):
    """Actualiza la contraseña del usuario."""
    pass1 = request.POST.get('pass1')
    pass2 = request.POST.get('pass2')

    if not pass1 or not pass2:
        return JsonResponse({'success': False, 'message': 'La contraseña no puede estar vacía.'})
    if pass1 != pass2:
        return JsonResponse({'success': False, 'message': 'Las contraseñas no coinciden.'})

    user.contrasena = make_password(pass1)
    user.save()
    return JsonResponse({'success': True, 'message': 'Contraseña actualizada correctamente.'})


def _update_image(request, user):
    """Actualiza la imagen de perfil del usuario."""
    if 'profileImage' not in request.FILES:
        return JsonResponse({'success': False, 'message': 'No se ha subido ninguna imagen.'})

    image_file = request.FILES['profileImage']

    if image_file.size > 2 * 1024 * 1024:
        return JsonResponse({'success': False, 'message': 'La imagen es demasiado grande (máx 2MB).'})

    try:
        img = Image.open(image_file)
        if img.format.upper() not in ['JPEG', 'PNG']:
            return JsonResponse({'success': False, 'message': 'Formato de imagen no válido. Solo se permite JPG y PNG.'})

        ext = 'jpg' if img.format.upper() == 'JPEG' else 'png'
        
        old_img_name = user.img
        if old_img_name and old_img_name != 'default.png':
            old_img_path = os.path.join(settings.MEDIA_ROOT, 'profile', old_img_name)
            if os.path.exists(old_img_path):
                os.remove(old_img_path)

        new_filename = f"{user.cc}.{ext}"
        new_path = os.path.join(settings.MEDIA_ROOT, 'profile', new_filename)

        if img.mode != 'RGB':
            img = img.convert('RGB')

        img.save(new_path, format='JPEG' if ext == 'jpg' else 'PNG', quality=85)

        user.img = new_filename
        user.save()
        request.session['user_img'] = new_filename

        new_image_url = _get_profile_url(new_filename)
        return JsonResponse({'success': True, 'message': 'Imagen de perfil actualizada.', 'new_image_url': new_image_url})

    except Exception as e:
        return JsonResponse({'success': False, 'message': f'Error procesando la imagen: {e}'})

def perfil_view(request):
    """Vista para mostrar y actualizar perfil de usuario."""

    # Validar sesión
    if 'user_id' not in request.session:
        return redirect('/')

    if request.method == 'POST':
        action = request.POST.get('action')
        user_id = request.session.get('user_id')

        try:
            user = Usuario.objects.get(id=user_id)
        except Usuario.DoesNotExist:
            return JsonResponse({'success': False, 'message': 'Usuario no encontrado.'}, status=404)

        # Actualizar contraseña
        if action == 'update_password':
            pass1 = request.POST.get('pass1')
            pass2 = request.POST.get('pass2')

            if not pass1 or not pass2:
                return JsonResponse({'success': False, 'message': 'La contraseña no puede estar vacía.'})
            if pass1 != pass2:
                return JsonResponse({'success': False, 'message': 'Las contraseñas no coinciden.'})

            user.contrasena = make_password(pass1)
            user.save()
            return JsonResponse({'success': True, 'message': 'Contraseña actualizada correctamente.'})

        # Actualizar imagen de perfil
        if action == 'update_image':
            if 'profileImage' not in request.FILES:
                return JsonResponse({'success': False, 'message': 'No se ha subido ninguna imagen.'})

            image_file = request.FILES['profileImage']

            # Validación de tamaño (máx 2MB)
            if image_file.size > 2 * 1024 * 1024:
                return JsonResponse({'success': False, 'message': 'La imagen es demasiado grande (máx 2MB).'})

            try:
                img = Image.open(image_file)

                if img.format.upper() not in ['JPEG', 'PNG']:
                    return JsonResponse({
                        'success': False,
                        'message': 'Formato de imagen no válido. Solo se permite JPG y PNG.'
                    })

                # Determinar extensión
                ext = 'jpg' if img.format.upper() == 'JPEG' else 'png'

                # Eliminar imagen antigua
                old_img_name = user.img
                if old_img_name and old_img_name != 'default.png':
                    old_img_path = os.path.join(settings.MEDIA_ROOT, 'profile', old_img_name)
                    if os.path.exists(old_img_path):
                        os.remove(old_img_path)

                # Guardar nueva imagen
                new_filename = f"{user.cc}.{ext}"
                new_path = os.path.join(settings.MEDIA_ROOT, 'profile', new_filename)

                if img.mode != 'RGB':
                    img = img.convert('RGB')

                img.save(new_path, format='JPEG' if ext == 'jpg' else 'PNG', quality=85)

                # Actualizar usuario y sesión
                user.img = new_filename
                user.save()
                request.session['user_img'] = new_filename

                new_image_url = _get_profile_url(new_filename)
                return JsonResponse({
                    'success': True,
                    'message': 'Imagen de perfil actualizada.',
                    'new_image_url': new_image_url
                })

            except Exception as e:
                return JsonResponse({'success': False, 'message': f'Error procesando la imagen: {e}'})

        return JsonResponse({'success': False, 'message': 'Acción no válida.'}, status=400)

    # Obtener notificaciones de solicitudes aprobadas
    user_id = request.session.get('user_id')
    notificaciones_list = Solicitud.objects.filter(
        usuario_id=user_id,
        estado=1
    ).select_related('solicitud_url')

    paginator_notificaciones = Paginator(notificaciones_list, 3)  # Muestra 5 notificaciones por página
    page_number_notificaciones = request.GET.get('page_notificaciones')
    notificaciones = paginator_notificaciones.get_page(page_number_notificaciones)

    # Obtener permisos de URL para el usuario
    permisos_url_list = PermisoUrl.objects.filter(
        usuario_id=user_id,
        estado=1
    ).select_related('url', 'url__area').order_by('url__nombre')

    search_query = request.GET.get('search_permisos', '')
    if search_query:
        permisos_url_list = permisos_url_list.filter(
            models.Q(url__nombre__icontains=search_query) |
            models.Q(url__descrip__icontains=search_query) |
            models.Q(url__area__nombre__icontains=search_query)
        )

    paginator_permisos = Paginator(permisos_url_list, 3)  # Muestra 10 permisos por página
    page_number_permisos = request.GET.get('page_permisos')
    permisos_url = paginator_permisos.get_page(page_number_permisos)

    context = {
        'notificaciones': notificaciones,
        'permisos_url': permisos_url,
        'search_query': search_query,
    }

    # Renderizar template de perfil
    return render(request, 'perfil.html', context)


def notificaciones_json(request):
    """Devuelve las notificaciones de un usuario en formato JSON."""
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'result': [], 'count': 0})

    notificaciones_list = Solicitud.objects.filter(
        usuario_id=user_id,
        estado=1
    ).select_related('solicitud_url', 'solicitud_url__area')

    count = len(notificaciones_list)

    # Se ha eliminado 'fecha_solicitud' de aquí
    data = [{
        'informe': n.solicitud_url.nombre,
        'area': n.solicitud_url.area.nombre,
        'estado': n.get_estado_display()
    } for n in notificaciones_list]

    return JsonResponse({'result': data, 'count': count})

def permisos_json(request):
    """Devuelve los permisos de un usuario en formato JSON."""
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'result': [], 'count': 0})

    permisos_url_list = PermisoUrl.objects.filter(
        usuario_id=user_id,
        estado=1
    ).select_related('url', 'url__area').order_by('url__nombre')

    count = len(permisos_url_list)

    data = [{
        'nombre': p.url.nombre,
        'area': p.url.area.nombre
    } for p in permisos_url_list]

    return JsonResponse({'result': data, 'count': count})


