from django.shortcuts import render, redirect
from django.contrib import messages
from login.models import Usuario, TipoUsuario
from django.core.files.storage import FileSystemStorage
from django.conf import settings
import os
import uuid
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.contrib.auth.hashers import check_password, make_password
from login.models import ClaveUsuario
from login.views import verify_password
from django.core.mail import EmailMultiAlternatives

def perfil_view(request):
    user_id = request.session.get('user_id')
    if not user_id:
        return redirect('login')

    usuario = Usuario.objects.get(id=user_id)
    
    if request.method == 'POST':
        if 'profile_image' in request.FILES:
            image = request.FILES['profile_image']
            
            # Delete old image if it exists and is not default
            if usuario.profile and 'default' not in usuario.profile:
                try:
                    old_image_path = os.path.join(settings.MEDIA_ROOT, str(usuario.profile).replace('profile/', ''))
                    
                    # Let's be safer with path construction
                    if str(usuario.profile).startswith('profile/'):
                        relative_path = str(usuario.profile).split('/', 1)[1]
                        old_image_path = os.path.join(settings.MEDIA_ROOT, 'profile', relative_path)
                    else:
                        # Fallback if stored differently
                        old_image_path = os.path.join(settings.MEDIA_ROOT, str(usuario.profile))

                    if os.path.exists(old_image_path):
                        os.remove(old_image_path)
                except Exception as e:
                    print(f"Error deleting old profile image: {e}")

            fs = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'profile'))
            
            # Generate unique filename
            ext = image.name.split('.')[-1]
            new_filename = f"{uuid.uuid4().hex}.{ext}"
            
            filename = fs.save(new_filename, image)
            
            # Update user profile path
            # Store relative path from MEDIA_URL
            usuario.profile = f"profile/{filename}"
            usuario.save()
            messages.success(request, 'Foto de perfil actualizada correctamente.')
            return redirect('perfil:perfil')

    # Get permissions
    permisos = TipoUsuario.objects.filter(usuario__docnumber=usuario.docnumber)
    
    from usuarios_sa.models import PoliticaContrasena
    policies = PoliticaContrasena.objects.filter(estado=True).values('id', 'regla', 'descripcion', 'ejemplo')

    context = {
        'usuario': usuario,
        'permisos': permisos,
        'policies': list(policies),
    }
    return render(request, 'perfil.html', context)

@require_POST
def verify_password_view(request):
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'success': False, 'message': 'Usuario no autenticado.'}, status=401)

    current_password = request.POST.get('current_password')
    if not current_password:
        return JsonResponse({'success': False, 'message': 'Contraseña requerida.'})

    try:
        usuario = Usuario.objects.get(id=user_id)
        clave_obj = ClaveUsuario.objects.get(usuario=usuario)
        
        # Use the same verification logic as login
        if verify_password(current_password, clave_obj.password):
            return JsonResponse({'success': True})
        else:
            return JsonResponse({'success': False, 'message': 'Contraseña incorrecta.'})
            
    except (Usuario.DoesNotExist, ClaveUsuario.DoesNotExist):
        return JsonResponse({'success': False, 'message': 'Error al verificar usuario.'})

@require_POST
def change_password_view(request):
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'success': False, 'message': 'Usuario no autenticado.'}, status=401)

    new_password = request.POST.get('new_password')
    confirm_password = request.POST.get('confirm_password')

    if not new_password or not confirm_password:
        return JsonResponse({'success': False, 'message': 'Todos los campos son obligatorios.'})

    if new_password != confirm_password:
        return JsonResponse({'success': False, 'message': 'Las contraseñas no coinciden.'})

    try:
        usuario = Usuario.objects.get(id=user_id)
        clave_obj = ClaveUsuario.objects.get(usuario=usuario)
        
        clave_obj.password = make_password(new_password)
        clave_obj.save()
        
        return JsonResponse({'success': True, 'message': 'Contraseña actualizada exitosamente.'})
            
    except (Usuario.DoesNotExist, ClaveUsuario.DoesNotExist):
        return JsonResponse({'success': False, 'message': 'Error al actualizar contraseña.'})

@require_POST
def report_error_view(request):
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'success': False, 'message': 'Usuario no autenticado.'}, status=401)

    error_description = request.POST.get('error_description')
    if not error_description:
        return JsonResponse({'success': False, 'message': 'La descripción del error es obligatoria.'})

    try:
        usuario = Usuario.objects.get(id=user_id)
        
        subject = f'Reporte de Datos Errados - {usuario.nombre}'
        to_emails = ['comunicacionesgghh@jolifoods.com', 'yeison.betancur@jolifoods.com', 'fernando.zuluaga@jolifoods.com']
        cc_emails = ['joan.montoya@jolifoods.com']
        
        # Template HTML profesional (Reutilizado y adaptado)
        html_message = f"""
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="utf-8">
            <style>
                body {{
                    font-family: 'Inter', system-ui, -apple-system, sans-serif;
                    margin: 0;
                    padding: 0;
                    background-color: #0f172a;
                }}
                .wrapper {{
                    width: 100%;
                    background: linear-gradient(175deg, #3f9b9c 3%, #653db6 38%, #45a8ac 68%, #6f42c9 100%);
                    padding: 40px 0;
                }}
                .container {{
                    max-width: 600px;
                    margin: 0 auto;
                    background-color: #1e293b;
                    border-radius: 16px;
                    overflow: hidden;
                    box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
                    border: 1px solid rgba(255, 255, 255, 0.1);
                }}
                .header {{
                    background: rgba(15, 23, 42, 0.6);
                    padding: 30px;
                    text-align: center;
                    border-bottom: 1px solid rgba(255, 255, 255, 0.1);
                }}
                .logo-text {{
                    font-size: 28px;
                    font-weight: 800;
                    background: linear-gradient(to right, #5de1e6, #8b53fe);
                    -webkit-background-clip: text;
                    -webkit-text-fill-color: transparent;
                    text-transform: uppercase;
                    letter-spacing: -1px;
                    margin: 0;
                    display: inline-block;
                    color: #8b53fe; /* Fallback */
                }}
                .content {{
                    padding: 40px 30px;
                    text-align: left;
                    color: #ffffff;
                }}
                .title {{
                    font-size: 24px;
                    font-weight: 700;
                    margin-bottom: 16px;
                    color: #ffffff;
                    text-align: center;
                }}
                .text {{
                    font-size: 16px;
                    line-height: 1.6;
                    color: #cbd5e1;
                    margin-bottom: 20px;
                }}
                .data-box {{
                    background-color: rgba(255, 255, 255, 0.05);
                    padding: 20px;
                    border-radius: 8px;
                    margin-bottom: 20px;
                    border: 1px solid rgba(255, 255, 255, 0.1);
                }}
                .label {{
                    font-size: 12px;
                    color: #94a3b8;
                    text-transform: uppercase;
                    letter-spacing: 0.5px;
                    margin-bottom: 4px;
                    display: block;
                }}
                .value {{
                    font-size: 16px;
                    color: #ffffff;
                    font-weight: 500;
                }}
                .footer {{
                    background-color: rgba(15, 23, 42, 0.6);
                    padding: 20px;
                    text-align: center;
                    font-size: 12px;
                    color: #94a3b8;
                    border-top: 1px solid rgba(255, 255, 255, 0.1);
                }}
            </style>
        </head>
        <body>
            <div class="wrapper">
                <div class="container">
                    <div class="header">
                        <h1 class="logo-text">VIBRA 2.0</h1>
                    </div>
                    <div class="content">
                        <h2 class="title">Reporte de Datos Errados</h2>
                        <p class="text">
                            El usuario <strong>{usuario.nombre}</strong> ha reportado información incorrecta en su perfil.
                        </p>
                        
                        <div class="data-box">
                            <span class="label">Nombre del Usuario</span>
                            <div class="value">{usuario.nombre}</div>
                            <br>
                            <span class="label">Documento</span>
                            <div class="value">{usuario.docnumber}</div>
                        </div>

                        <p class="text"><strong>Descripción del error reportado:</strong></p>
                        <div class="data-box">
                            <div class="value" style="white-space: pre-wrap;">{error_description}</div>
                        </div>
                    </div>
                    <div class="footer">
                        &copy; 2024 VIBRA 2.0 - Sistema de Gestión Integral<br>
                        Este es un correo automático generado por el sistema.
                    </div>
                </div>
            </div>
        </body>
        </html>
        """
        
        plain_message = f"""Reporte de Datos Errados

Usuario: {usuario.nombre}
Documento: {usuario.docnumber}

Descripción del error:
{error_description}

Enviado desde VIBRA 2.0
"""
        
        msg = EmailMultiAlternatives(subject, plain_message, settings.DEFAULT_FROM_EMAIL, to_emails, cc=cc_emails)
        msg.attach_alternative(html_message, "text/html")
        msg.send()
        
        return JsonResponse({'success': True, 'message': 'Reporte enviado exitosamente.'})
            
    except Exception as e:
        print(f"Error enviando reporte: {e}")
        return JsonResponse({'success': False, 'message': 'Error al enviar el reporte. Intenta más tarde.'})
