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

from accounts.permissions import accountant_required
from core.models import Project
from core.project_utils import get_current_project, require_active_project
from finance.models import BankAccount, BankTransaction, CashTransaction


def _current_project(request):
    return get_current_project(request)

@login_required
def cash_book(request):
    project = _current_project(request)
    transactions = CashTransaction.objects.filter(project=project) if project else CashTransaction.objects.none()
    return render(request, "finance/cash_book.html", {"transactions": transactions, "project": project})


@accountant_required
@require_active_project
def cash_entry_create(request):
    project = _current_project(request)
    if request.method == "POST":
        CashTransaction.objects.create(
            project=project,
            date=request.POST.get("date"),
            txn_type=request.POST.get("txn_type"),
            amount=request.POST.get("amount"),
            source_or_purpose=request.POST.get("source_or_purpose", ""),
            remarks=request.POST.get("remarks", ""),
            created_by=request.user,
        )
        messages.success(request, "Cash entry recorded.")
        return redirect("finance:cash_book")
    return render(request, "finance/cash_form.html")


@login_required
def bank_statement(request):
    project = _current_project(request)
    accounts = BankAccount.objects.filter(project=project) if project else BankAccount.objects.none()
    return render(request, "finance/bank_statement.html", {"accounts": accounts, "project": project})


@accountant_required
@require_active_project
def bank_account_create(request):
    project = _current_project(request)
    if request.method == "POST":
        BankAccount.objects.create(
            project=project,
            bank_name=request.POST.get("bank_name"),
            account_number=request.POST.get("account_number", ""),
            branch=request.POST.get("branch", ""),
            opening_balance=request.POST.get("opening_balance") or 0,
        )
        messages.success(request, "Bank account added.")
        return redirect("finance:bank_statement")
    return render(request, "finance/bank_account_form.html")


@accountant_required
@require_active_project
def bank_txn_create(request, pk):
    from django.shortcuts import get_object_or_404
    account = get_object_or_404(BankAccount, pk=pk)
    if request.method == "POST":
        BankTransaction.objects.create(
            bank_account=account,
            date=request.POST.get("date"),
            txn_type=request.POST.get("txn_type"),
            amount=request.POST.get("amount"),
            remarks=request.POST.get("remarks", ""),
            created_by=request.user,
        )
        messages.success(request, "Bank transaction recorded.")
    return redirect("finance:bank_statement")
