from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404

from accounts.permissions import accountant_required
from core.models import Project
from core.project_utils import get_current_project, require_active_project
from labor.models import Worker, WorkerAttendance, WorkerPayment


def _current_project(request):
    return get_current_project(request)

@login_required
def worker_list(request):
    project = _current_project(request)
    workers = Worker.objects.filter(project=project) if project else Worker.objects.none()
    return render(request, "labor/worker_list.html", {"workers": workers, "project": project})


@accountant_required
@require_active_project
def worker_create(request):
    project = _current_project(request)
    if request.method == "POST":
        Worker.objects.create(
            project=project,
            name=request.POST.get("name"),
            work_type=request.POST.get("work_type"),
            mobile_number=request.POST.get("mobile_number", ""),
            rate_type=request.POST.get("rate_type"),
            daily_rate=request.POST.get("daily_rate") or 0,
            contract_amount=request.POST.get("contract_amount") or 0,
            created_by=request.user,
        )
        messages.success(request, "Worker added.")
        return redirect("labor:worker_list")
    return render(request, "labor/worker_form.html")


@login_required
def worker_detail(request, pk):
    worker = get_object_or_404(Worker, pk=pk)
    return render(request, "labor/worker_detail.html", {
        "worker": worker,
        "attendances": worker.attendances.all()[:30],
        "payments": worker.payments.all()[:30],
    })


@accountant_required
@require_active_project
def attendance_create(request, pk):
    worker = get_object_or_404(Worker, pk=pk)
    if request.method == "POST":
        WorkerAttendance.objects.update_or_create(
            worker=worker, date=request.POST.get("date"),
            defaults={
                "days_worked": request.POST.get("days_worked") or 1,
                "remarks": request.POST.get("remarks", ""),
                "created_by": request.user,
            },
        )
        messages.success(request, "Attendance recorded.")
    return redirect("labor:worker_detail", pk=worker.pk)


@accountant_required
@require_active_project
def payment_create(request, pk):
    worker = get_object_or_404(Worker, pk=pk)
    if request.method == "POST":
        WorkerPayment.objects.create(
            worker=worker,
            date=request.POST.get("date"),
            amount=request.POST.get("amount"),
            payment_type=request.POST.get("payment_type"),
            remarks=request.POST.get("remarks", ""),
            created_by=request.user,
        )
        messages.success(request, "Payment recorded.")
    return redirect("labor:worker_detail", pk=worker.pk)
