from django.shortcuts import render, redirect
from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth.hashers import make_password
import os
from PIL import Image
from usuarios.models import Usuario


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 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)

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