from functools import wraps

from django.contrib import messages
from django.shortcuts import redirect


def es_cajero(user):
    return user.is_superuser or user.groups.filter(name='Cajero').exists()


def es_mesero(user):
    return user.groups.filter(name='Mesero').exists() and not es_cajero(user)


def es_admin(user):
    return user.is_superuser


def debe_respetar_horario_laboral(user):
    """Meseros y cajeros deben usar la app solo dentro del horario laboral configurado.
    Los administradores (superusuarios) nunca se ven afectados."""
    if es_admin(user):
        return False
    return es_mesero(user) or es_cajero(user)


def cajero_required(view_func):
    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
        if not es_cajero(request.user):
            messages.error(request, 'No tienes permiso para acceder a esta sección.')
            return redirect('ventas:jornadas_list')
        return view_func(request, *args, **kwargs)
    return wrapper


def admin_required(view_func):
    """Para acciones reservadas al administrador (no basta con ser cajero), como reabrir un turno ya cerrado."""
    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
        if not es_admin(request.user):
            messages.error(request, 'Solo un administrador puede reabrir una jornada cerrada.')
            pk = kwargs.get('pk')
            if pk:
                return redirect('ventas:jornada_detail', pk=pk)
            return redirect('ventas:jornadas_list')
        return view_func(request, *args, **kwargs)
    return wrapper
