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 materials.models import Material, MaterialPurchase, MaterialUsage, UNIT_CHOICES


def _current_project(request):
    return get_current_project(request)

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


@accountant_required
@require_active_project
def material_create(request):
    project = _current_project(request)
    if request.method == "POST":
        Material.objects.create(
            project=project,
            name=request.POST.get("name"),
            unit=request.POST.get("unit"),
            reorder_level=request.POST.get("reorder_level") or 0,
        )
        messages.success(request, "Material added.")
        return redirect("materials:stock_list")
    return render(request, "materials/material_form.html", {"unit_choices": UNIT_CHOICES})


@login_required
def purchase_list(request):
    project = _current_project(request)
    purchases = MaterialPurchase.objects.filter(project=project).select_related("material") \
        if project else MaterialPurchase.objects.none()
    return render(request, "materials/purchase_list.html", {"purchases": purchases, "project": project})


@accountant_required
@require_active_project
def purchase_create(request):
    project = _current_project(request)
    materials = Material.objects.filter(project=project) if project else Material.objects.none()
    if request.method == "POST":
        MaterialPurchase.objects.create(
            project=project,
            material_id=request.POST.get("material"),
            date=request.POST.get("date"),
            quantity=request.POST.get("quantity"),
            unit_price=request.POST.get("unit_price") or 0,
            vendor=request.POST.get("vendor", ""),
            invoice_no=request.POST.get("invoice_no", ""),
            invoice_attachment=request.FILES.get("invoice_attachment"),
            remarks=request.POST.get("remarks", ""),
            created_by=request.user,
        )
        messages.success(request, "Purchase recorded and stock updated.")
        return redirect("materials:purchase_list")
    return render(request, "materials/purchase_form.html", {"materials": materials})


@accountant_required
@require_active_project
def usage_create(request):
    project = _current_project(request)
    materials = Material.objects.filter(project=project) if project else Material.objects.none()
    if request.method == "POST":
        MaterialUsage.objects.create(
            project=project,
            material_id=request.POST.get("material"),
            date=request.POST.get("date"),
            quantity=request.POST.get("quantity"),
            used_for=request.POST.get("used_for", ""),
            remarks=request.POST.get("remarks", ""),
            created_by=request.user,
        )
        messages.success(request, "Usage recorded and stock updated.")
        return redirect("materials:stock_list")
    return render(request, "materials/usage_form.html", {"materials": materials})
