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 contractors.models import Contractor, ContractorBill, ContractorPayment
from core.models import Project
from core.project_utils import get_current_project, require_active_project


def _current_project(request):
    return get_current_project(request)

@login_required
def contractor_list(request):
    project = _current_project(request)
    contractors = Contractor.objects.filter(project=project) if project else Contractor.objects.none()
    return render(request, "contractors/contractor_list.html", {"contractors": contractors, "project": project})


@accountant_required
@require_active_project
def contractor_create(request):
    project = _current_project(request)
    if request.method == "POST":
        Contractor.objects.create(
            project=project,
            name=request.POST.get("name"),
            mobile_number=request.POST.get("mobile_number", ""),
            work_order_no=request.POST.get("work_order_no", ""),
            work_description=request.POST.get("work_description", ""),
            contract_amount=request.POST.get("contract_amount") or 0,
            created_by=request.user,
        )
        messages.success(request, "Contractor added.")
        return redirect("contractors:contractor_list")
    return render(request, "contractors/contractor_form.html")


@login_required
def contractor_detail(request, pk):
    contractor = get_object_or_404(Contractor, pk=pk)
    return render(request, "contractors/contractor_detail.html", {
        "contractor": contractor,
        "bills": contractor.bills.all(),
        "payments": contractor.payments.all(),
    })


@accountant_required
@require_active_project
def bill_create(request, pk):
    contractor = get_object_or_404(Contractor, pk=pk)
    if request.method == "POST":
        ContractorBill.objects.create(
            contractor=contractor,
            date=request.POST.get("date"),
            amount=request.POST.get("amount"),
            description=request.POST.get("description", ""),
            attachment=request.FILES.get("attachment"),
            created_by=request.user,
        )
        messages.success(request, "Bill recorded.")
    return redirect("contractors:contractor_detail", pk=contractor.pk)


@accountant_required
@require_active_project
def payment_create(request, pk):
    contractor = get_object_or_404(Contractor, pk=pk)
    if request.method == "POST":
        ContractorPayment.objects.create(
            contractor=contractor,
            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("contractors:contractor_detail", pk=contractor.pk)
