from django.shortcuts import render, redirect
from django.contrib.auth import login, logout
from django.contrib import messages
from .models import (
    Usuario,
    Plato,
    PedidosCliente,
    Pedido,
    Resenia,
    Repartidor,
    PlatoPedido,
    PlatoCombo,
    Combo,
    Descuento,
)
from django.contrib.auth.hashers import make_password
from django.contrib.auth import authenticate
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect
from django.core.paginator import Paginator
import logging

logger = logging.getLogger(__name__)


# Página de inicio
def index(request):
    return render(request, "delivery_app/index.html")


# Página de menú
def menu(request):
    platos = Plato.objects.all().order_by('plato')
    success = request.GET.get('success', False)
    
    # Verificar y establecer imagen por defecto para platos sin imagen
    for plato in platos:
        if not plato.imagen:
            plato.imagen_url = 'img/not_image.png'
        else:
            plato.imagen_url = plato.imagen.url
            
    return render(request, "delivery_app/menu.html", {
        "platos": platos,
        "plato_agregado": success
    })


# Página de promociones
def promociones(request):
    return render(request, "delivery_app/promociones.html")


# Carrito simulado para ejemplo
carrito_items = [
    {"plato": "Empanadas de Carne", "cantidad": 1, "precio_unitario": 9500},
    {"plato": "Milanesa con Papas Fritas", "cantidad": 2, "precio_unitario": 12000},
]


@login_required
def vista_carrito(request):
    carrito = request.session.get("carrito", [])
    total_carrito = sum(item["total"] for item in carrito)
    
    # Inicializar variables
    total_antes_descuento = total_carrito
    descuento_aplicado = request.session.get("descuento_aplicado", 0)
    total_con_descuento = total_carrito - descuento_aplicado

    # Obtener dirección del usuario si existe
    comentarios = request.POST.get("comentarios", "")
    direccion = request.POST.get("direccion", "") or request.user.domicilio

    if request.method == "POST":
        accion = request.POST.get("accion", "")
        
        # Manejar acciones de sumar, restar y eliminar 
        if accion.startswith(("sumar_", "restar_", "eliminar_")):
            accion_tipo, item_id = accion.split("_")
            item_id = int(item_id)
            
            for item in carrito:
                if ("plato_id" in item and item["plato_id"] == item_id) or \
                   ("combo_id" in item and item["combo_id"] == item_id):
                    if accion_tipo == "sumar":
                        item["cantidad"] += 1
                    elif accion_tipo == "restar" and item["cantidad"] > 1:
                        item["cantidad"] -= 1
                    elif accion_tipo == "eliminar":
                        carrito.remove(item)
                        break
                    
                    if accion_tipo != "eliminar":
                        item["total"] = item["precio_unitario"] * item["cantidad"]

            # Recalcular totales
            request.session["carrito"] = carrito
            total_carrito = sum(item["total"] for item in carrito)
            total_antes_descuento = total_carrito
            
            # Recalcular descuento si hay uno aplicado
            if descuento_aplicado > 0:
                descuentos = Descuento.objects.filter(monto_min__lte=total_carrito).order_by('-descuento')
                if descuentos.exists():
                    descuento = descuentos.first()
                    descuento_aplicado = (descuento.descuento / 100) * total_carrito
                    total_con_descuento = total_carrito - descuento_aplicado
                else:
                    descuento_aplicado = 0
                    total_con_descuento = total_carrito
                request.session["descuento_aplicado"] = descuento_aplicado

            return redirect("carrito")

        elif accion == "aplicar_descuento":
            if total_carrito > 0:
                descuentos = Descuento.objects.filter(monto_min__lte=total_carrito).order_by('-descuento')
                if descuentos.exists():
                    descuento = descuentos.first()
                    descuento_aplicado = (descuento.descuento / 100) * total_carrito
                    total_con_descuento = total_carrito - descuento_aplicado
                    request.session["descuento_aplicado"] = descuento_aplicado
                    messages.success(request, f"Descuento de ${descuento_aplicado:.2f} aplicado exitosamente.")
                else:
                    messages.info(request, "No hay descuentos disponibles para el monto actual.")
            return redirect("carrito")

        elif accion == "confirmar":
            # Usar la dirección del usuario si no se proporcionó una
            direccion_pedido = direccion or request.user.domicilio
            if not direccion_pedido:
                messages.error(request, "Por favor ingrese una dirección de entrega.")
                return redirect("carrito")

            pedido = Pedido.objects.create(
                comentarios=comentarios,
                direccion=direccion_pedido,
                estado="pendiente_aprobacion",
                precio_total=total_con_descuento
            )

            PedidosCliente.objects.create(
                usuario=request.user,
                pedido=pedido
            )

            # Agregar los platos al pedido
            for item in carrito:
                if "plato_id" in item:
                    plato = Plato.objects.get(id=item["plato_id"])
                    PlatoPedido.objects.create(
                        pedido=pedido,
                        plato=plato,
                        cantidad=item["cantidad"]
                    )
                elif "combo_id" in item:
                    combo = Combo.objects.get(id=item["combo_id"])
                    platos_combo = PlatoCombo.objects.filter(combo=combo)
                    for plato_combo in platos_combo:
                        PlatoPedido.objects.create(
                            pedido=pedido,
                            plato=plato_combo.plato,
                            cantidad=item["cantidad"]
                        )

            # Limpiar el carrito y descuento
            request.session["carrito"] = []
            request.session["descuento_aplicado"] = 0
            messages.success(request, "Pedido realizado exitosamente.")
            return redirect("pedidos")

    return render(
        request,
        "delivery_app/carrito.html",
        {
            "carrito": carrito,
            "total_antes_descuento": total_antes_descuento,
            "descuento_aplicado": descuento_aplicado,
            "total_carrito": total_con_descuento,
            "comentarios": comentarios,
            "direccion": direccion,
        },
    )


def confirmar_pedido(request):
    return render(request, "delivery_app/confirmar_pedido.html")


def agregar_al_carrito(request):
    if request.method == "POST":
        carrito = request.session.get("carrito", [])

        plato_id = request.POST.get("plato_id")
        combo_id = request.POST.get("combo_id")

        if plato_id:
            try:
                plato = get_object_or_404(Plato, id=plato_id)
                if plato.disponibilidad == 'no_disponible':
                    return JsonResponse({"error": "Plato no disponible"}, status=400)

                encontrado = False
                for item in carrito:
                    if item.get("plato_id") == int(plato_id):
                        item["cantidad"] += 1
                        item["total"] = item["cantidad"] * item["precio_unitario"]
                        encontrado = True
                        break

                if not encontrado:
                    carrito.append({
                        "plato_id": int(plato_id),
                        "plato": plato.plato,
                        "cantidad": 1,
                        "precio_unitario": float(plato.precio),
                        "total": float(plato.precio)
                    })

            except Exception as e:
                logger.error(f"Error al procesar plato ID {plato_id}: {str(e)}")
                return JsonResponse({"error": "Error al procesar el plato"}, status=400)

        elif combo_id:
            try:
                combo = get_object_or_404(Combo, id=combo_id)
                if combo.disponibilidad == 'no_disponible':
                    return JsonResponse({"error": "Combo no disponible"}, status=400)

                encontrado = False
                for item in carrito:
                    if item.get("combo_id") == int(combo_id):
                        item["cantidad"] += 1
                        item["total"] = item["cantidad"] * item["precio_unitario"]
                        encontrado = True
                        break

                if not encontrado:
                    carrito.append({
                        "combo_id": int(combo_id),
                        "plato": combo.nombre,
                        "cantidad": 1,
                        "precio_unitario": float(combo.precio),
                        "total": float(combo.precio)
                    })

            except Exception as e:
                logger.error(f"Error al procesar combo ID {combo_id}: {str(e)}")
                return JsonResponse({"error": "Error al procesar el combo"}, status=400)

        else:
            return JsonResponse({"error": "No se proporcionó ID de plato ni de combo"}, status=400)

        # Actualizar carrito en la sesión
        request.session["carrito"] = carrito
        request.session["descuento_aplicado"] = 0

        return redirect('/combos/')

    return JsonResponse({"error": "Método no permitido"}, status=405)


# Login de usuarios
def login_user(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")

        # Autenticar usuario
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            messages.success(request, "Inicio de sesión exitoso.")
            return redirect("index")
        else:
            messages.error(request, "Usuario o contraseña incorrectos.")
    return render(request, "delivery_app/login.html")


# Registro de usuarios
def register_user(request):
    if request.method == "POST":
        username = request.POST["username"]
        password = request.POST["password"]
        nombre = request.POST["nombre"]
        apellido = request.POST["apellido"]
        email = request.POST["email"]
        domicilio = request.POST["domicilio"]
        telefono = request.POST["telefono"]
        rol = request.POST.get(
            "rol", "cliente"
        )  # Valor por defecto 'cliente' si no se proporciona 'rol'

        if Usuario.objects.filter(username=username).exists():
            messages.error(request, "El nombre de usuario ya existe.")
        else:
            hashed_password = make_password(password)
            usuario = Usuario.objects.create(
                username=username,
                password=hashed_password,
                nombre=nombre,
                apellido=apellido,
                email=email,
                domicilio=domicilio,
                telefono=telefono,
                rol=rol,
            )
            messages.success(request, "Registro exitoso. Ahora puedes iniciar sesión.")
            return redirect("login")
    return render(request, "delivery_app/register.html")


# Logout de usuarios
def logout_user(request):
    logout(request)
    messages.success(request, "Has cerrado sesión exitosamente.")
    return redirect("index")


# Perfil de usuario
def profile(request):
    user = request.user
    return render(request, "delivery_app/profile.html", {"user": user})


@login_required
def pedidos(request):
    usuario = request.user
    estados_permitidos = []
    
    if usuario.rol == "cliente":
        estados_permitidos = ['pendiente_aprobacion', 'en_preparacion', 'preparado']
        pedidos_cliente = Pedido.objects.filter(
            pedidoscliente__usuario=usuario,
            estado__in=estados_permitidos
        ).order_by('-creado_en')
    elif usuario.rol == "empleado":
        pedidos_cliente = Pedido.objects.exclude(
            estado='entregado'
        ).order_by('-creado_en')
        estados_permitidos = ["en_preparacion", "preparado"]
    elif usuario.rol == "repartidor": 
        pedidos_cliente = Pedido.objects.filter(
            estado__in=["preparado", "pendiente_entrega"]
        ).order_by('-creado_en')
        estados_permitidos = ["pendiente_entrega", "entregado"]
    else:
        pedidos_cliente = []

    if request.method == "POST":
        pedido_id = request.POST.get("pedido_id")
        accion = request.POST.get("accion")
        pedido = get_object_or_404(Pedido, id=pedido_id)

        if usuario.rol == "empleado":
            if accion == "aprobar":
                pedido.estado = "aceptado"
                messages.success(request, "Pedido aprobado exitosamente.")
            elif accion == "rechazar":
                pedido.estado = "rechazado"
                messages.success(request, "Pedido rechazado exitosamente.")
            elif accion in estados_permitidos:
                pedido.estado = accion
                messages.success(request, "Estado del pedido actualizado exitosamente.")
        elif usuario.rol == "repartidor":
            if accion in estados_permitidos:
                pedido.estado = accion
                if accion == "pendiente_entrega":
                    try:
                        repartidor = Repartidor.objects.get(usuario=usuario)
                        pedido.repartidor = repartidor
                    except Repartidor.DoesNotExist:
                        messages.error(request, "No se encontró un repartidor asociado al usuario actual.")
                        return redirect("pedidos")
                messages.success(request, "Estado del pedido actualizado exitosamente.")

        pedido.save()
        return redirect("pedidos")

    paginator = Paginator(pedidos_cliente, 20)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(
        request,
        "delivery_app/pedidos.html",
        {
            "page_obj": page_obj,
            "usuario": usuario,
            "estados_permitidos": estados_permitidos,
        },
    )


@login_required
def pedido_detalle(request, pedido_id):
    pedido = get_object_or_404(Pedido, id=pedido_id)
    platos_pedido = PlatoPedido.objects.filter(pedido=pedido)
    precio_total = sum(
        plato_pedido.plato.precio * plato_pedido.cantidad
        for plato_pedido in platos_pedido
    )
    return render(
        request,
        "delivery_app/pedido_detalle.html",
        {
            "pedido": pedido,
            "platos_pedido": platos_pedido,
            "precio_total": precio_total,
        },
    )


@login_required
def realizar_pedido(request):
    if request.method == "POST":
        comentarios = request.POST["comentarios"]
        direccion = request.POST["direccion"]
        resenia_id = request.POST["resenia"]
        repartidor_id = request.POST["repartidor"]
        estado = "pendiente_aprobacion"
        platos = request.POST.getlist("platos")
        cantidades = request.POST.getlist("cantidades")

        resenia = Resenia.objects.get(id=resenia_id)
        repartidor = Repartidor.objects.get(id=repartidor_id)

        pedido = Pedido.objects.create(
            comentarios=comentarios,
            direccion=direccion,
            resenia=resenia,
            repartidor=repartidor,
            estado=estado,
        )

        usuario = request.user
        PedidosCliente.objects.create(usuario=usuario, pedido=pedido)

        for plato_id, cantidad in zip(platos, cantidades):
            plato = Plato.objects.get(id=plato_id)
            PlatoPedido.objects.create(pedido=pedido, plato=plato, cantidad=cantidad)

        messages.success(request, "Pedido realizado exitosamente.")
        return redirect("pedidos")

    resenias = Resenia.objects.all()
    repartidores = Repartidor.objects.all()
    platos = Plato.objects.all()
    return render(
        request,
        "delivery_app/realizar_pedido.html",
        {"resenias": resenias, "repartidores": repartidores, "platos": platos},
    )


@login_required
def pedidos_pendientes(request):
    usuario = request.user
    if usuario.rol != "repartidor":
        messages.error(request, "No tienes permiso para acceder a esta página.")
        return redirect("index")

    pedidos_pendientes = Pedido.objects.filter(
        estado__in=["preparado", "pendiente_entrega"]
    )

    estados_permitidos = ["pendiente_entrega", "entregado"]

    if request.method == "POST":
        pedido_id = request.POST.get("pedido_id")
        nuevo_estado = request.POST.get("estado")
        pedido = get_object_or_404(Pedido, id=pedido_id)

        if nuevo_estado in estados_permitidos:
            pedido.estado = nuevo_estado
            if nuevo_estado == "pendiente_entrega":
                try:
                    repartidor = Repartidor.objects.get(usuario=usuario)
                    pedido.repartidor = repartidor
                except Repartidor.DoesNotExist:
                    messages.error(
                        request,
                        "No se encontró un repartidor asociado al usuario actual.",
                    )
                    return redirect("pedidos_pendientes")
            pedido.save()
            messages.success(request, "Estado del pedido actualizado exitosamente.")

        return redirect("pedidos_pendientes")

    return render(
        request,
        "delivery_app/pedidos_pendientes.html",
        {"pedidos": pedidos_pendientes, "estados_permitidos": estados_permitidos},
    )

@login_required
def cambiar_estado_pedido(request, pedido_id):
    pedido = get_object_or_404(Pedido, id=pedido_id)
    if request.method == 'POST':
        nuevo_estado = request.POST.get('estado')
        pedido.estado = nuevo_estado
        pedido.save()
        messages.success(request, 'Estado del pedido actualizado exitosamente.')
        return redirect('pedidos')

    estados = [estado for estado in Pedido.ESTADOS if estado[0] in ['en_preparacion', 'preparado']]
    return render(request, 'delivery_app/cambiar_estado_pedido.html', {'pedido': pedido, 'estados': estados})

@login_required
def cambiar_estado_pedido_repartidor(request, pedido_id):
    pedido = get_object_or_404(Pedido, id=pedido_id)
    if request.method == 'POST':
        nuevo_estado = request.POST.get('estado')
        pedido.estado = nuevo_estado
        if nuevo_estado == 'pendiente_entrega':
            try:
                repartidor = Repartidor.objects.get(usuario=request.user)
                pedido.repartidor = repartidor
            except Repartidor.DoesNotExist:
                messages.error(request, 'No se encontró un repartidor asociado al usuario actual.')
                return redirect('pedidos_pendientes')
        pedido.save()
        messages.success(request, 'Estado del pedido actualizado exitosamente.')
        return redirect('pedidos_pendientes')
    estados = Pedido.ESTADOS
    return render(request, 'delivery_app/cambiar_estado_pedido_repartidor.html', {'pedido': pedido, 'estados': estados})

@login_required
def agregar_plato(request):
    if request.method == 'POST':
        plato_data = {
            'plato': request.POST['plato'],
            'ingredientes': request.POST['ingredientes'],
            'descripcion': request.POST['descripcion'],
            't_preparacion': request.POST['t_preparacion'],
            'precio': request.POST['precio'],
            'disponibilidad': request.POST['disponibilidad']
        }
        
        plato = Plato.objects.create(**plato_data)
        
        if 'imagen' in request.FILES:
            plato.imagen = request.FILES['imagen']
            plato.save()
            
        messages.success(request, 'Plato agregado exitosamente')
        return redirect('menu')
    
    return render(request, "delivery_app/agregar_plato.html", {
        'disponibilidades': Plato.DISPONIBILIDAD
    })

@login_required
def editar_plato(request, plato_id):
    plato = get_object_or_404(Plato, id=plato_id)
    
    if request.method == 'POST':
        plato.plato = request.POST.get('plato')
        plato.ingredientes = request.POST.get('ingredientes')
        plato.descripcion = request.POST.get('descripcion')
        plato.t_preparacion = request.POST.get('t_preparacion')
        plato.precio = request.POST.get('precio')

        if 'imagen' in request.FILES:
            # Eliminar imagen anterior si existe
            if plato.imagen:
                plato.imagen.delete()
            plato.imagen = request.FILES['imagen']
            
        plato.save()
        messages.success(request, 'Plato actualizado exitosamente')
        return redirect('menu')
    
    return redirect('menu')

@login_required
def eliminar_plato(request, plato_id):
    plato = get_object_or_404(Plato, id=plato_id)
    plato.delete()
    messages.success(request, 'Plato eliminado exitosamente')
    return redirect('menu')

@login_required
def cambiar_estado_pedido(request, pedido_id):
    pedido = get_object_or_404(Pedido, id=pedido_id)
    if request.method == "POST":
        nuevo_estado = request.POST.get("estado")
        pedido.estado = nuevo_estado
        pedido.save()
        messages.success(request, "Estado del pedido actualizado exitosamente.")
        return redirect("pedidos")
    estados = Pedido.ESTADOS
    return render(
        request,
        "delivery_app/cambiar_estado_pedido.html",
        {"pedido": pedido, "estados": estados},
    )


@login_required
def cambiar_disponibilidad_plato(request, plato_id):
    plato = get_object_or_404(Plato, id=plato_id)
    if request.method == "POST":
        nueva_disponibilidad = request.POST.get("disponibilidad")
        plato.disponibilidad = nueva_disponibilidad
        plato.save()
        messages.success(request, "Disponibilidad del plato actualizada exitosamente.")
        return redirect("menu")
    disponibilidades = Plato.DISPONIBILIDAD
    return render(
        request,
        "delivery_app/cambiar_disponibilidad_plato.html",
        {"plato": plato, "disponibilidades": disponibilidades},
    )


@login_required
def agregar_combo(request, combo_id=None):
    if request.method == 'POST':
        # Obtener datos del formulario
        combo_data = {
            'nombre': request.POST['nombre'],
            'precio': request.POST['precio'],
            'disponibilidad': request.POST['disponibilidad']
        }
        
        # Crear o actualizar el combo
        if combo_id:
            combo = get_object_or_404(Combo, id=combo_id)
            for key, value in combo_data.items():
                setattr(combo, key, value)
        else:
            combo = Combo.objects.create(**combo_data)
        
        # Manejar la imagen si se proporcionó
        if 'imagen' in request.FILES:
            combo.imagen = request.FILES['imagen']
        
        combo.save()

        # Actualizar platos del combo
        combo.platos.clear()
        if request.POST.getlist('platos'):
            for plato_id in request.POST.getlist('platos'):
                PlatoCombo.objects.create(combo=combo, plato_id=plato_id)

        messages.success(request, f'Combo {"actualizado" if combo_id else "agregado"} exitosamente')
        return redirect('combos')

    # Renderizar formulario
    contexto = {
        'platos': Plato.objects.all(),
        'disponibilidades': Combo.DISPONIBILIDAD
    }
    if combo_id:
        contexto['combo'] = get_object_or_404(Combo, id=combo_id)
    
    return render(request, "delivery_app/agregar_combo.html", contexto)

# Detalle de combo
def combo_detalle(request, combo_id):
    combo = get_object_or_404(Combo, id=combo_id)
    platos_combo = PlatoCombo.objects.filter(combo=combo)
    return render(
        request,
        "delivery_app/combo_detalle.html",
        {"combo": combo, "platos_combo": platos_combo},
    )


def combos(request):
    combos = Combo.objects.all()  # Mostrar todos los combos
    return render(request, "delivery_app/combos.html", {"combos": combos})


@login_required
def cambiar_disponibilidad_combo(request, combo_id):
    combo = get_object_or_404(Combo, id=combo_id)
    if request.method == "POST":
        nueva_disponibilidad = request.POST.get("disponibilidad")
        combo.disponibilidad = nueva_disponibilidad
        combo.save()
        messages.success(request, "Disponibilidad del combo actualizada exitosamente.")
        return redirect("combos")
    disponibilidades = Combo.DISPONIBILIDAD
    return render(
        request,
        "delivery_app/cambiar_estado_combo.html",
        {"combo": combo, "disponibilidades": disponibilidades},
    )

@login_required
def eliminar_combo(request, combo_id):
    combo = get_object_or_404(Combo, id=combo_id)
    if request.method == "POST":
        combo.delete()
        messages.success(request, "Combo eliminado exitosamente.")
        return redirect("combos")
    return render(request, "delivery_app/combos.html")

@login_required
def descuentos(request):
    if request.user.rol != "empleado":
        messages.error(request, "No tienes permiso para acceder a esta página.")
        return redirect("menu")
        
    descuentos = Descuento.objects.all().order_by('monto_min')
    return render(request, "delivery_app/descuentos.html", {"descuentos": descuentos})

@login_required 
def agregar_descuento(request):
    if request.user.rol != "empleado":
        messages.error(request, "No tienes permiso para acceder a esta página.")
        return redirect("menu")

    if request.method == "POST":
        monto_min = float(request.POST["monto_min"])
        descuento = float(request.POST["descuento"])
        
        # Validar que el descuento esté entre 0 y 100
        if descuento < 0 or descuento > 100:
            messages.error(request, "El descuento debe estar entre 0 y 100%")
            return redirect("descuentos")
            
        # Validar que el monto mínimo sea positivo
        if monto_min < 0:
            messages.error(request, "El monto mínimo debe ser positivo")
            return redirect("descuentos")
            
        Descuento.objects.create(
            monto_min=monto_min,
            descuento=descuento
        )
        messages.success(request, "Descuento agregado exitosamente.")
        return redirect("descuentos")
        
    return redirect("descuentos")

@login_required
def editar_descuento(request, descuento_id):
    if request.user.rol != "empleado":
        messages.error(request, "No tienes permiso para acceder a esta página.")
        return redirect("menu")
        
    descuento = get_object_or_404(Descuento, id=descuento_id)
    
    if request.method == "POST":
        monto_min = float(request.POST["monto_min"]) 
        porcentaje = float(request.POST["descuento"])
        
        # Validar que el descuento esté entre 0 y 100
        if porcentaje < 0 or porcentaje > 100:
            messages.error(request, "El descuento debe estar entre 0 y 100%")
            return redirect("descuentos")
            
        # Validar que el monto mínimo sea positivo
        if monto_min < 0:
            messages.error(request, "El monto mínimo debe ser positivo")
            return redirect("descuentos")
            
        descuento.monto_min = monto_min
        descuento.descuento = porcentaje
        descuento.save()
        
        messages.success(request, "Descuento actualizado exitosamente.")
        return redirect("descuentos")
        
    return redirect("descuentos")

@login_required
def eliminar_descuento(request, descuento_id):
    if request.user.rol != "empleado":
        messages.error(request, "No tienes permiso para acceder a esta página.")
        return redirect("menu")
        
    descuento = get_object_or_404(Descuento, id=descuento_id)
    descuento.delete()
    messages.success(request, "Descuento eliminado exitosamente.")
    return redirect("descuentos")

@login_required
def historial(request):
    usuario = request.user
    
    if usuario.rol == 'cliente':
        pedidos = Pedido.objects.filter(
            pedidoscliente__usuario=usuario,
            estado__in=['entregado', 'rechazado']
        ).order_by('-creado_en')
    elif usuario.rol == 'repartidor':
        pedidos = Pedido.objects.filter(
            repartidor__usuario=usuario,
            estado__in=['entregado', 'rechazado']
        ).order_by('-creado_en')
    else:
        pedidos = Pedido.objects.filter(
            estado__in=['entregado', 'rechazado']
        ).order_by('-creado_en')

    paginator = Paginator(pedidos, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'delivery_app/historial.html', {
        'page_obj': page_obj,
        'usuario': usuario
    })
    
@login_required
def agregar_resenia(request, pedido_id):
    pedido = get_object_or_404(Pedido, id=pedido_id)
    
    # Verificar que el pedido pertenezca al cliente
    if not PedidosCliente.objects.filter(usuario=request.user, pedido=pedido).exists():
        messages.error(request, "No tienes permiso para dejar reseña en este pedido.")
        return redirect("historial")
        
    if request.method == "POST":
        tipo = request.POST.get("tipo")
        descripcion = request.POST.get("descripcion")
        
        if tipo and descripcion:
            # Crear la reseña
            resenia = Resenia.objects.create(
                tipo=tipo,
                descripcion=descripcion
            )
            # Actualizar el pedido con la reseña
            pedido.resenia = resenia
            pedido.save()
            messages.success(request, "Reseña agregada exitosamente.")
        else:
            messages.error(request, "Por favor complete todos los campos.")
            
    return redirect("historial")
