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 contributions.models import Contribution
from core.models import Project
from core.project_utils import get_current_project, require_active_project
from members.models import Member


def _current_project(request):
    return get_current_project(request)

@login_required
def contribution_list(request):
    project = _current_project(request)
    contributions = Contribution.objects.filter(member__project_id=project.pk).select_related("member") \
        if project else Contribution.objects.none()
    members = Member.objects.filter(project_id=project.pk) if project else Member.objects.none()

    # Company Members can see only their own contribution ledger.
    from core.project_utils import get_membership
    membership = get_membership(request.user, project)
    if membership and membership.role == "member":
        contributions = contributions.filter(member__user=request.user)
        members = members.filter(user=request.user)
    else:
        member_filter = request.GET.get("member")
        if member_filter:
            contributions = contributions.filter(member_id=member_filter)
    return render(request, "contributions/contribution_list.html", {
        "contributions": contributions, "members": members, "project": project,
    })


@accountant_required
@require_active_project
def contribution_create(request):
    project = _current_project(request)
    members = Member.objects.filter(project_id=project.pk, is_active=True) if project else Member.objects.none()
    if request.method == "POST":
        member_id = request.POST.get("member")
        member = get_object_or_404(Member, pk=member_id, project_id=project.pk, is_active=True)
        Contribution.objects.create(
            member=member,
            date=request.POST.get("date"),
            amount=request.POST.get("amount"),
            payment_method=request.POST.get("payment_method"),
            reference_no=request.POST.get("reference_no", ""),
            remarks=request.POST.get("remarks", ""),
            attachment=request.FILES.get("attachment"),
            created_by=request.user,
        )
        messages.success(request, "Contribution recorded.")
        return redirect("contributions:contribution_list")
    return render(request, "contributions/contribution_form.html", {"members": members})


@accountant_required
@require_active_project
def contribution_edit(request, pk):
    contribution = get_object_or_404(Contribution, pk=pk)
    # Keep edits inside the currently selected company.
    project = _current_project(request)
    contribution_project_id = contribution.member.project_id
    if project is None or str(contribution_project_id) != str(project.pk):
        return redirect("contributions:contribution_list")
    members = Member.objects.filter(project_id=project.pk, is_active=True)
    if request.method == "POST":
        member = get_object_or_404(
            Member, pk=request.POST.get("member"), project_id=project.pk, is_active=True
        )
        contribution.member = member
        contribution.date = request.POST.get("date")
        contribution.amount = request.POST.get("amount")
        contribution.payment_method = request.POST.get("payment_method")
        contribution.reference_no = request.POST.get("reference_no", "")
        contribution.remarks = request.POST.get("remarks", "")
        if request.FILES.get("attachment"):
            contribution.attachment = request.FILES.get("attachment")
        contribution.updated_by = request.user
        contribution.save()
        messages.success(request, "Contribution updated.")
        return redirect("contributions:contribution_list")
    return render(request, "contributions/contribution_form.html", {
        "contribution": contribution, "members": members,
    })
