"""Expense and other-income lifecycle, validation, and workspace isolation."""
import pytest
import uuid
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 workspace(client,user,name):
    data=client.post('/api/businesses',json={"name":name,"main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers={**h(user),"Idempotency-Key":uuid.uuid4().hex}).json()
    return data['business']['id'],data['accessible_branches'][0]['id']
def test_expense_lifecycle_filters_and_isolation(client,verified_user):
    business,branch=workspace(client,verified_user,'Expenses')
    cat=client.post(f'/api/businesses/{business}/expense-categories',json={'name':'Rent'},headers=h(verified_user)); assert cat.status_code==201
    category=cat.json(); assert client.get(f'/api/businesses/{business}/expense-categories',headers=h(verified_user)).json()[0]['id']==category['id']
    bad=client.post(f'/api/businesses/{business}/expenses',json={'category_id':category['id'],'description':'Bad','amount':'0','expense_date':'2026-01-01','payment_method':'CASH'},headers=h(verified_user)); assert bad.status_code==422
    made=client.post(f'/api/businesses/{business}/expenses',json={'branch_id':branch,'category_id':category['id'],'description':'Rent','amount':'1200.50','expense_date':'2026-01-01','payment_method':'TRANSFER'},headers=h(verified_user)); assert made.status_code==201
    expense=made.json(); assert expense['status']=='ACTIVE' and expense['recorded_by']==str(verified_user.id)
    assert client.get(f'/api/businesses/{business}/expenses?status=ACTIVE&branch_id={branch}',headers=h(verified_user)).json()[0]['id']==expense['id']
    assert client.patch(f'/api/businesses/{business}/expenses/{expense["id"]}',json={'amount':'1300','payment_method':'CASH'},headers=h(verified_user)).status_code==200
    assert client.post(f'/api/businesses/{business}/expenses/{expense["id"]}/cancel',headers=h(verified_user)).json()['status']=='CANCELLED'
    assert client.patch(f'/api/businesses/{business}/expenses/{expense["id"]}',json={'amount':'1'},headers=h(verified_user)).status_code==422
    assert client.patch(f'/api/businesses/{business}/expense-categories/{category["id"]}',json={'is_active':False},headers=h(verified_user)).json()['is_active'] is False
    other,_=workspace(client,verified_user,'Other Expenses')
    assert client.get(f'/api/businesses/{other}/expenses/{expense["id"]}',headers=h(verified_user)).status_code==404
    assert client.post(f'/api/businesses/{other}/expenses',json={'category_id':category['id'],'description':'Wrong','amount':'1','payment_method':'CASH'},headers=h(verified_user)).status_code==404
    assert client.get(f'/api/businesses/{business}/expenses').status_code==401
def test_other_income_lifecycle_and_isolation(client,verified_user):
    business,branch=workspace(client,verified_user,'Income')
    category=client.post(f'/api/businesses/{business}/other-income-categories',json={'name':'Delivery fees'},headers=h(verified_user)).json()
    made=client.post(f'/api/businesses/{business}/other-income',json={'branch_id':branch,'category_id':category['id'],'description':'Delivery','amount':'300','income_date':'2026-02-01'},headers=h(verified_user)); assert made.status_code==201
    income=made.json(); assert client.get(f'/api/businesses/{business}/other-income?category_id={category["id"]}',headers=h(verified_user)).json()[0]['id']==income['id']
    assert client.patch(f'/api/businesses/{business}/other-income/{income["id"]}',json={'amount':'350'},headers=h(verified_user)).status_code==200
    assert client.post(f'/api/businesses/{business}/other-income/{income["id"]}/cancel',headers=h(verified_user)).json()['status']=='CANCELLED'
    assert client.patch(f'/api/businesses/{business}/other-income/{income["id"]}',json={'description':'x'},headers=h(verified_user)).status_code==422
    assert client.patch(f'/api/businesses/{business}/other-income-categories/{category["id"]}',json={'is_active':False},headers=h(verified_user)).json()['is_active'] is False
    other,_=workspace(client,verified_user,'Other Income')
    assert client.get(f'/api/businesses/{other}/other-income/{income["id"]}',headers=h(verified_user)).status_code==404
    assert client.post(f'/api/businesses/{other}/other-income',json={'category_id':category['id'],'description':'Wrong','amount':'1'},headers=h(verified_user)).status_code==404
