from functools import wraps
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.db.models import Count, Q
from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
from .forms import ExecutiveCreateForm, TaskForm, CompletionForm
from .models import Profile, Task


def owner_required(view):
    @wraps(view)
    @login_required
    def wrapped(request,*args,**kwargs):
        if request.user.is_superuser or getattr(getattr(request.user,'profile',None),'role',None) == 'owner':
            return view(request,*args,**kwargs)
        return HttpResponseForbidden('غير مصرح لك بالدخول لهذه الصفحة')
    return wrapped

@login_required
def dashboard(request):
    is_owner = request.user.is_superuser or getattr(getattr(request.user,'profile',None),'role',None) == 'owner'
    if is_owner:
        tasks = Task.objects.select_related('assigned_to').all()
        counts = Task.objects.aggregate(total=Count('id'), pending=Count('id',filter=Q(status='pending')), completed=Count('id',filter=Q(status='completed')))
        executives = User.objects.filter(profile__role='executive').annotate(
            total_tasks=Count('assigned_tasks'),
            pending_tasks=Count('assigned_tasks',filter=Q(assigned_tasks__status='pending')),
            completed_tasks=Count('assigned_tasks',filter=Q(assigned_tasks__status='completed')),
        )
        return render(request,'tasks/owner_dashboard.html',{'tasks':tasks[:20],'counts':counts,'executives':executives})
    tasks = Task.objects.filter(assigned_to=request.user)
    return render(request,'tasks/executive_dashboard.html',{
        'pending':tasks.filter(status='pending'),
        'completed':tasks.filter(status='completed').order_by('-completed_at'),
        'pending_count':tasks.filter(status='pending').count(),
        'completed_count':tasks.filter(status='completed').count(),
    })

@owner_required
def executive_create(request):
    form = ExecutiveCreateForm(request.POST or None)
    if request.method == 'POST' and form.is_valid():
        form.save()
        messages.success(request,'تم إنشاء حساب المدير بنجاح.')
        return redirect('dashboard')
    return render(request,'tasks/form_page.html',{'form':form,'heading':'إضافة مدير تنفيذي','button':'إنشاء الحساب'})

@owner_required
def task_create(request):
    form = TaskForm(request.POST or None)
    if request.method == 'POST' and form.is_valid():
        task = form.save(commit=False)
        task.created_by = request.user
        task.save()
        messages.success(request,'تم إسناد المهمة بنجاح.')
        return redirect('dashboard')
    return render(request,'tasks/form_page.html',{'form':form,'heading':'إسناد مهمة جديدة','button':'حفظ المهمة'})

@login_required
def task_list(request):
    is_owner = request.user.is_superuser or getattr(getattr(request.user,'profile',None),'role',None) == 'owner'
    tasks = Task.objects.select_related('assigned_to','created_by').all() if is_owner else Task.objects.filter(assigned_to=request.user)
    status = request.GET.get('status')
    if status in {'pending','completed'}: tasks = tasks.filter(status=status)
    return render(request,'tasks/task_list.html',{'tasks':tasks,'is_owner':is_owner,'status':status})

@login_required
def task_detail(request, pk):
    task = get_object_or_404(Task.objects.select_related('assigned_to','created_by'), pk=pk)
    is_owner = request.user.is_superuser or getattr(getattr(request.user,'profile',None),'role',None) == 'owner'
    if not is_owner and task.assigned_to_id != request.user.id:
        return HttpResponseForbidden('غير مصرح')
    return render(request,'tasks/task_detail.html',{'task':task,'is_owner':is_owner})

@login_required
def task_complete(request, pk):
    task = get_object_or_404(Task, pk=pk, assigned_to=request.user)
    if task.status == 'completed':
        messages.info(request,'هذه المهمة مكتملة بالفعل.')
        return redirect('task_detail',pk=pk)
    form = CompletionForm(request.POST or None, instance=task)
    if request.method == 'POST' and form.is_valid():
        task = form.save(commit=False)
        task.status='completed'
        task.completed_at=timezone.now()
        task.save()
        messages.success(request,'تم تسجيل المهمة كمكتملة.')
        return redirect('dashboard')
    return render(request,'tasks/form_page.html',{'form':form,'heading':f'إكمال المهمة: {task.title}','button':'تأكيد الإكمال'})
