"""Invoice coverage including no-stock and debt-book synchronization."""
import pytest
pytest_plugins=("test_workspace",)
def h(user):
 from app.core.security import create_access_token
 return {"Authorization":f"Bearer {create_access_token(str(user.id))}"}
def setup(client,user):
 w=client.post('/api/businesses/onboarding',json={"name":"Invoice","main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers=h(user)).json();b=w['business']['id'];branch=w['accessible_branches'][0]['id']
 c=client.post(f'/api/businesses/{b}/customers',json={"name":"Customer"},headers=h(user)).json();p=client.post(f'/api/businesses/{b}/products',json={"name":"Product","product_type":"SINGLE","selling_price":"100"},headers=h(user)).json()
 client.post(f'/api/businesses/{b}/branches/{branch}/stock-adjustments',json={"product_id":p['id'],"quantity_changed":"5","reason":"RESTOCK"},headers=h(user))
 return b,branch,c,p
def standalone(cust,p,num='INV-1'):
 return {"customer_id":cust,"invoice_number":num,"items":[{"product_id":p,"description":"Product","quantity":"2","unit_price":"100"}]}
def test_standalone_invoice_does_not_move_stock_and_receivable(client,verified_user):
 b,branch,c,p=setup(client,verified_user);before=client.get(f'/api/businesses/{b}/branches/{branch}/inventory',headers=h(verified_user)).json()[0]['quantity']
 r=client.post(f'/api/businesses/{b}/invoices',json=standalone(c['id'],p['id']),headers=h(verified_user));assert r.status_code==201
 invoice=r.json()['invoice'];assert invoice['total']==200.0 and invoice['balance']==200.0
 assert client.get(f'/api/businesses/{b}/branches/{branch}/inventory',headers=h(verified_user)).json()[0]['quantity']==before
 debt=client.get(f'/api/businesses/{b}/receivables',headers=h(verified_user)).json();assert len(debt)==1 and debt[0]['invoice_id']==invoice['id']
def test_draft_send_and_payments(client,verified_user):
 b,_,c,p=setup(client,verified_user);i=client.post(f'/api/businesses/{b}/invoices',json=standalone(c['id'],p['id']),headers=h(verified_user)).json()['invoice']
 assert client.patch(f'/api/businesses/{b}/invoices/{i["id"]}',json={"tax":"10"},headers=h(verified_user)).status_code==200
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/send',headers=h(verified_user)).status_code==200
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/payments',json={"amount":"50","payment_method":"CASH"},headers=h(verified_user)).status_code==201
 d=client.get(f'/api/businesses/{b}/invoices/{i["id"]}',headers=h(verified_user)).json()['invoice'];assert d['status']=='PARTIALLY_PAID' and d['balance']==160.0
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/payments',json={"amount":"0","payment_method":"CASH"},headers=h(verified_user)).status_code==422
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/payments',json={"amount":"161","payment_method":"CASH"},headers=h(verified_user)).status_code==422
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/payments',json={"amount":"160","payment_method":"TRANSFER"},headers=h(verified_user)).status_code==201
 assert client.get(f'/api/businesses/{b}/invoices/{i["id"]}',headers=h(verified_user)).json()['invoice']['status']=='PAID'
def test_sale_linked_invoice_reuses_debt_and_stock(client,verified_user):
 b,branch,c,p=setup(client,verified_user);sale=client.post(f'/api/businesses/{b}/sales',json={"branch_id":branch,"customer_id":c['id'],"receipt_number":"SALE-1","items":[{"product_id":p['id'],"quantity":"1","unit_price":"100"}],"payments":[]},headers={**h(verified_user),"Idempotency-Key":"sale-1"}).json()['sale']
 stock=client.get(f'/api/businesses/{b}/branches/{branch}/inventory',headers=h(verified_user)).json()[0]['quantity'];i=client.post(f'/api/businesses/{b}/invoices',json={"sale_id":sale['id'],"invoice_number":"SALE-INV"},headers=h(verified_user));assert i.status_code==201
 assert client.get(f'/api/businesses/{b}/branches/{branch}/inventory',headers=h(verified_user)).json()[0]['quantity']==stock
 assert len(client.get(f'/api/businesses/{b}/receivables',headers=h(verified_user)).json())==1
 assert client.post(f'/api/businesses/{b}/invoices',json={"sale_id":sale['id'],"invoice_number":"OTHER"},headers=h(verified_user)).status_code==422
 iid=i.json()['invoice']['id'];assert client.post(f'/api/businesses/{b}/invoices/{iid}/payments',json={"amount":"100","payment_method":"POS"},headers=h(verified_user)).status_code==201
 assert client.get(f'/api/businesses/{b}/sales/{sale["id"]}',headers=h(verified_user)).json()['sale']['payment_status']=='PAID'
def test_isolation_cancel_and_unauthenticated(client,verified_user):
 b,_,c,p=setup(client,verified_user);i=client.post(f'/api/businesses/{b}/invoices',json=standalone(c['id'],p['id']),headers=h(verified_user)).json()['invoice']
 assert client.get(f'/api/businesses/{b}/invoices/{i["id"]}').status_code==401
 other=client.post('/api/businesses',json={"name":"Other","main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers={**h(verified_user),"Idempotency-Key":"other"}).json()['business']['id']
 assert client.get(f'/api/businesses/{other}/invoices/{i["id"]}',headers=h(verified_user)).status_code==404
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/cancel',headers=h(verified_user)).status_code==200
 assert client.post(f'/api/businesses/{b}/invoices/{i["id"]}/payments',json={"amount":"1","payment_method":"CASH"},headers=h(verified_user)).status_code==422
