"""API coverage for atomic, business-scoped purchase receiving and payments."""
from decimal import Decimal
import pytest

pytest_plugins = ("test_workspace",)

def headers(user):
 from app.core.security import create_access_token
 return {"Authorization": f"Bearer {create_access_token(str(user.id))}"}
def setup_purchase(client,user):
 workspace=client.post('/api/businesses/onboarding',json={"name":"Purchase Store","main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers=headers(user)).json()
 business=workspace['business']['id'];branch=workspace['accessible_branches'][0]['id']
 supplier=client.post(f'/api/businesses/{business}/suppliers',json={"name":"Supplier"},headers=headers(user)).json()
 unit=client.post(f'/api/businesses/{business}/units',json={"name":"Piece","symbol":"pc"},headers=headers(user)).json()
 product=client.post(f'/api/businesses/{business}/products',json={"name":"Rice","product_type":"SINGLE","selling_price":"1","base_unit_id":unit['id']},headers=headers(user)).json()
 return business,branch,supplier,unit,product
def create(client,user,ctx,reference='PO-1',quantity='2',cost='30'):
 b,branch,supplier,unit,product=ctx
 return client.post(f'/api/businesses/{b}/purchases',json={"branch_id":branch,"supplier_id":supplier['id'],"reference_number":reference,"purchase_date":"2026-09-20","discount":"5","tax":"1","items":[{"product_id":product['id'],"unit_id":unit['id'],"quantity":quantity,"unit_cost":cost}]},headers=headers(user))
def test_draft_receive_and_payment_lifecycle(client,verified_user):
 ctx=setup_purchase(client,verified_user); b,branch,*_=ctx; response=create(client,verified_user,ctx)
 assert response.status_code==201; purchase=response.json()['purchase']; assert Decimal(purchase['total'])==Decimal('56')
 assert client.get(f'/api/businesses/{b}/branches/{branch}/inventory',headers=headers(verified_user)).json()==[]
 assert client.post(f"/api/businesses/{b}/purchases/{purchase['id']}/receive",headers=headers(verified_user)).status_code==200
 inventory=client.get(f'/api/businesses/{b}/branches/{branch}/inventory',headers=headers(verified_user)).json(); assert Decimal(inventory[0]['quantity'])==2
 assert client.post(f"/api/businesses/{b}/purchases/{purchase['id']}/receive",headers=headers(verified_user)).status_code==422
 partial=client.post(f"/api/businesses/{b}/purchases/{purchase['id']}/payments",json={"amount":"20","payment_method":"CASH"},headers=headers(verified_user));assert partial.status_code==201;assert partial.json()['payment_status']=='PARTIALLY_PAID'
 assert client.post(f"/api/businesses/{b}/purchases/{purchase['id']}/payments",json={"amount":"36","payment_method":"TRANSFER"},headers=headers(verified_user)).json()['payment_status']=='PAID'
 assert len(client.get(f"/api/businesses/{b}/purchases/{purchase['id']}/payments",headers=headers(verified_user)).json())==2
def test_cancelled_draft_and_cross_business_product_are_rejected(client,verified_user):
 ctx=setup_purchase(client,verified_user); b,*_=ctx; p=create(client,verified_user,ctx).json()['purchase']
 assert client.post(f"/api/businesses/{b}/purchases/{p['id']}/cancel",headers=headers(verified_user)).status_code==200
 assert client.post(f"/api/businesses/{b}/purchases/{p['id']}/receive",headers=headers(verified_user)).status_code==422
 second=client.post('/api/businesses',json={"name":"Other","main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers={**headers(verified_user),"Idempotency-Key":"purchase-other"}).json()['business']['id']
 assert client.get(f"/api/businesses/{second}/purchases/{p['id']}",headers=headers(verified_user)).status_code==404
