import pytest
from rest_framework.test import APIClient
from apps.companies.models import Company, Organization, OrganizationMembership
from apps.core.models import User
from apps.finance.models import Invoice, InvoiceLine


def api(user):
    client=APIClient(); client.force_authenticate(user); return client


@pytest.mark.django_db
def test_customer_invoice_uses_approve_then_issue_and_is_immutable():
    org = Organization.objects.create(name="Test Org")
    creator=User.objects.create_user(email="finance.staff@ar.test",password="p",organization_role="director")
    approver=User.objects.create_user(email="fat.manager@ar.test",password="p",organization_role="director")
    OrganizationMembership.objects.create(organization=org, user=creator)
    OrganizationMembership.objects.create(organization=org, user=approver)
    donor=Company.objects.create(organization=org, name="Funding Partner")
    invoice=Invoice.objects.create(organization=org, donor=donor,created_by=creator,due_date="2026-08-31")
    InvoiceLine.objects.create(invoice=invoice,description="Milestone",quantity=1,unit_price=100)
    invoice.recompute_totals(); invoice.save(update_fields=["subtotal","total"])
    own=api(creator).post(f"/api/finance-invoices/{invoice.id}/approve/",{},format="json")
    assert own.status_code==403
    approved=api(approver).post(f"/api/finance-invoices/{invoice.id}/approve/",{},format="json")
    assert approved.status_code==200
    issued=api(creator).post(f"/api/finance-invoices/{invoice.id}/issue/",{},format="json")
    assert issued.status_code==200
    edit=api(creator).patch(f"/api/finance-invoices/{invoice.id}/",{"notes":"changed"},format="json")
    delete=api(creator).delete(f"/api/finance-invoices/{invoice.id}/")
    assert edit.status_code==400
    assert delete.status_code==405
