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 expenses.models import Expense, ExpenseCategory, DEFAULT_CATEGORIES


def _current_project(request):
    return get_current_project(request)

@login_required
def expense_list(request):
    project = _current_project(request)
    expenses = Expense.objects.filter(project=project).select_related("category") \
        if project else Expense.objects.none()
    category_filter = request.GET.get("category")
    if category_filter:
        expenses = expenses.filter(category_id=category_filter)
    categories = ExpenseCategory.objects.filter(project=project) if project else ExpenseCategory.objects.none()
    return render(request, "expenses/expense_list.html", {
        "expenses": expenses, "categories": categories, "project": project,
    })


@accountant_required
@require_active_project
def expense_create(request):
    project = _current_project(request)
    categories = ExpenseCategory.objects.filter(project=project, is_active=True) if project else []
    if not categories and project:
        # First-time convenience: seed the standard construction categories.
        categories = [ExpenseCategory.objects.create(project=project, name=name) for name in DEFAULT_CATEGORIES]
    if request.method == "POST":
        Expense.objects.create(
            project=project,
            category_id=request.POST.get("category"),
            date=request.POST.get("date"),
            amount=request.POST.get("amount"),
            paid_to=request.POST.get("paid_to", ""),
            payment_method=request.POST.get("payment_method"),
            description=request.POST.get("description", ""),
            bill_attachment=request.FILES.get("bill_attachment"),
            created_by=request.user,
        )
        messages.success(request, "Expense recorded.")
        return redirect("expenses:expense_list")
    return render(request, "expenses/expense_form.html", {"categories": categories})


@accountant_required
@require_active_project
def expense_edit(request, pk):
    expense = get_object_or_404(Expense, pk=pk)
    categories = ExpenseCategory.objects.filter(project=expense.project)
    if request.method == "POST":
        expense.category_id = request.POST.get("category")
        expense.date = request.POST.get("date")
        expense.amount = request.POST.get("amount")
        expense.paid_to = request.POST.get("paid_to", "")
        expense.payment_method = request.POST.get("payment_method")
        expense.description = request.POST.get("description", "")
        if request.FILES.get("bill_attachment"):
            expense.bill_attachment = request.FILES.get("bill_attachment")
        expense.updated_by = request.user
        expense.save()
        messages.success(request, "Expense updated.")
        return redirect("expenses:expense_list")
    return render(request, "expenses/expense_form.html", {"expense": expense, "categories": categories})
