from django.shortcuts import render
from login.models import Usuario
from django.conf import settings

# Create your views here.
def usuarios_sa(request):
    from login.models import TipoUsuario
    
    # Get Role Choices for the sidebar
    all_role_choices = TipoUsuario._meta.get_field('tipo').choices
    # Filter out 'sa' and 'usuario'
    role_choices = [choice for choice in all_role_choices if choice[0] not in ['sa', 'user']]
    
    return render(request, 'usuarios_gghh.html', {
        'role_choices': role_choices,
    })

from django.http import JsonResponse
from django.views.decorators.http import require_POST, require_http_methods
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import get_object_or_404

from django.http import JsonResponse
from login.models import Usuario, TipoUsuario
from django.conf import settings

def api_users(request):
    # Fetch data as dicts directly to avoid model instantiation overhead
    usuarios = Usuario.objects.values(
        'id', 'nombre', 'email', 'cargo', 'area', 'profile', 'estado', 
        'docnumber', 'tipo_contratacion', 'jefe', 'correo_jefe', 
        'fecha_contratacion', 'fecha_cumple'
    )
    
    users_data = []
    
    for usuario in usuarios:
        # Profile URL logic
        profile_url = usuario['profile']
        if profile_url:
            if profile_url.startswith('/uploads/'):
                profile_url = profile_url.replace('/uploads/', settings.MEDIA_URL)
            elif not profile_url.startswith('http') and not profile_url.startswith(settings.MEDIA_URL):
                clean_profile = profile_url.lstrip('/')
                if clean_profile.startswith('profile/'):
                    profile_url = f"{settings.MEDIA_URL}{clean_profile}"
                else:
                    profile_url = f"{settings.MEDIA_URL}profile/{clean_profile}"
        
        users_data.append({
            'id': usuario['id'],
            'nombre': usuario['nombre'],
            'email': usuario['email'],
            'cargo': usuario['cargo'] or '',
            'area': usuario['area'] or '',
            'profile': profile_url,
            'estado': usuario['estado'],
            'docnumber': usuario['docnumber'],
            'tipo_contratacion': usuario['tipo_contratacion'] or '',
            'jefe': usuario['jefe'] or '',
            'correo_jefe': usuario['correo_jefe'] or '',
            'fecha_contratacion': usuario['fecha_contratacion'].strftime('%Y-%m-%d') if usuario['fecha_contratacion'] else '',
            'fecha_cumple': usuario['fecha_cumple'].strftime('%Y-%m-%d') if usuario['fecha_cumple'] else '',
        })
    
    return JsonResponse({'users': users_data}, safe=False)

def get_user_roles(request, usuario_id):
    usuario = get_object_or_404(Usuario, id=usuario_id)
    roles = list(usuario.tipos.values_list('tipo', flat=True))
    return JsonResponse({'roles': roles})

@require_POST
def update_user_role(request, usuario_id):
    import json
    try:
        data = json.loads(request.body)
        role_code = data.get('role')
        action = data.get('action') # 'add' or 'remove'
        
        # Security check: prevent adding restricted roles
        if role_code in ['sa', 'usuario']:
             return JsonResponse({'success': False, 'message': 'No tienes permiso para gestionar este rol.'}, status=403)

        print(f"DEBUG: update_user_role user={usuario_id} role={role_code} action={action}")
        
        usuario = get_object_or_404(Usuario, id=usuario_id)
        
        if action == 'add':
            # Check if already exists to avoid duplicates
            if not usuario.tipos.filter(tipo=role_code).exists():
                print(f"DEBUG: Creating role {role_code} for user {usuario.docnumber}")
                TipoUsuario.objects.create(usuario=usuario, tipo=role_code)
            else:
                print(f"DEBUG: Role {role_code} already exists")
        elif action == 'remove':
            print(f"DEBUG: Removing role {role_code} for user {usuario.docnumber}")
            usuario.tipos.filter(tipo=role_code).delete()
            
        return JsonResponse({'success': True})
    except Exception as e:
        print(f"DEBUG: Error in update_user_role: {str(e)}")
        return JsonResponse({'success': False, 'message': str(e)}, status=500)

@require_POST
def update_user_status(request, usuario_id):
    import json
    try:
        data = json.loads(request.body)
        new_status = data.get('status') # 1 or 0
        
        print(f"DEBUG: update_user_status user={usuario_id} status={new_status}")
        
        usuario = get_object_or_404(Usuario, id=usuario_id)
        usuario.estado = int(new_status)
        usuario.save()
            
        return JsonResponse({'success': True})
    except Exception as e:
        print(f"DEBUG: Error in update_user_status: {str(e)}")
        return JsonResponse({'success': False, 'message': str(e)}, status=500)

@require_POST
def update_user_details(request, usuario_id):
    import json
    from datetime import datetime
    try:
        data = json.loads(request.body)
        
        usuario = get_object_or_404(Usuario, id=usuario_id)
        
        # Update allowed fields
        usuario.nombre = data.get('nombre', usuario.nombre)
        usuario.email = data.get('email', usuario.email)
        usuario.jefe = data.get('jefe', usuario.jefe)
        usuario.correo_jefe = data.get('correo_jefe', usuario.correo_jefe)
        
        fecha_cumple = data.get('fecha_cumple')
        if fecha_cumple:
             # Ensure correct format if needed, but Django DateField handles YYYY-MM-DD strings well
            usuario.fecha_cumple = fecha_cumple
            
        usuario.save()
            
        return JsonResponse({'success': True})
    except Exception as e:
        print(f"DEBUG: Error in update_user_details: {str(e)}")
        return JsonResponse({'success': False, 'message': str(e)}, status=500)


import csv
from django.http import HttpResponse

def export_users_csv(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="usuarios.csv"'

    writer = csv.writer(response)
    writer.writerow(['Nombre', 'Email', 'Cargo', 'Area', 'Estado', 'Documento', 'Tipo Contratacion', 'Jefe', 'Correo Jefe', 'Fecha Contratacion', 'Fecha Cumpleanos'])

    users = Usuario.objects.all().values_list(
        'nombre', 'email', 'cargo', 'area', 'estado', 'docnumber', 
        'tipo_contratacion', 'jefe', 'correo_jefe', 'fecha_contratacion', 'fecha_cumple'
    )

    for user in users:
        # Convert status to readable text
        status = 'Activo' if user[4] == 1 else 'Inactivo'
        row = list(user)
        row[4] = status
        writer.writerow(row)

    return response

