"""Quote creation, lifecycle, isolation, and invoice conversion coverage."""
from datetime import date, timedelta
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, name="Quotes"):
    workspace=client.post('/api/businesses/onboarding',json={"name":name,"main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers=h(user)).json()
    business=workspace['business']['id']; branch=workspace['accessible_branches'][0]['id']
    customer=client.post(f'/api/businesses/{business}/customers',json={"name":"Customer"},headers=h(user)).json()
    product=client.post(f'/api/businesses/{business}/products',json={"name":"Product","product_type":"SINGLE","selling_price":"100"},headers=h(user)).json()
    client.post(f'/api/businesses/{business}/branches/{branch}/stock-adjustments',json={"product_id":product['id'],"quantity_changed":"10","reason":"RESTOCK"},headers=h(user))
    return business, branch, customer, product

def payload(customer, product, **more):
    data={"customer_id":customer,"items":[{"product_id":product,"description":"Product","quantity":"2","unit_price":"100","discount":"10"}],"discount":"5","tax":"15"}; data.update(more); return data

def test_quote_lifecycle_and_conversion_is_stock_safe(client, verified_user):
    business, branch, customer, product=setup(client,verified_user)
    before=client.get(f'/api/businesses/{business}/branches/{branch}/inventory',headers=h(verified_user)).json()[0]['quantity']
    made=client.post(f'/api/businesses/{business}/quotes',json=payload(customer['id'],product['id']),headers=h(verified_user)); assert made.status_code==201
    quote=made.json(); assert quote['status']=='DRAFT' and quote['subtotal']==190.0 and quote['total']==200.0
    assert client.get(f'/api/businesses/{business}/quotes',headers=h(verified_user)).json()[0]['id']==quote['id']
    updated=client.patch(f'/api/businesses/{business}/quotes/{quote["id"]}',json={"tax":"20"},headers=h(verified_user)); assert updated.status_code==200 and updated.json()['total']==205.0
    assert client.post(f'/api/businesses/{business}/quotes/{quote["id"]}/send',headers=h(verified_user)).status_code==200
    assert client.post(f'/api/businesses/{business}/quotes/{quote["id"]}/accept',headers=h(verified_user)).status_code==200
    converted=client.post(f'/api/businesses/{business}/quotes/{quote["id"]}/convert-to-invoice',headers=h(verified_user)); assert converted.status_code==200
    body=converted.json(); assert body['quote']['status']=='CONVERTED' and body['quote']['converted_invoice_id']==body['invoice_id']
    invoice=client.get(f'/api/businesses/{business}/invoices/{body["invoice_id"]}',headers=h(verified_user)).json(); assert invoice['invoice']['total']==205.0 and len(invoice['items'])==1
    assert client.get(f'/api/businesses/{business}/branches/{branch}/inventory',headers=h(verified_user)).json()[0]['quantity']==before
    retry=client.post(f'/api/businesses/{business}/quotes/{quote["id"]}/convert-to-invoice',headers=h(verified_user)); assert retry.status_code==200 and retry.json()['invoice_id']==body['invoice_id']
    assert client.patch(f'/api/businesses/{business}/quotes/{quote["id"]}',json={"tax":"2"},headers=h(verified_user)).status_code==422

def test_quote_transitions_expiry_and_business_isolation(client, verified_user):
    business, branch, customer, product=setup(client,verified_user)
    quote=client.post(f'/api/businesses/{business}/quotes',json=payload(customer['id'],product['id'],expiry_date=(date.today()-timedelta(days=1)).isoformat()),headers=h(verified_user)).json()
    assert client.post(f'/api/businesses/{business}/quotes/{quote["id"]}/send',headers=h(verified_user)).status_code==422
    assert client.post(f'/api/businesses/{business}/quotes/{quote["id"]}/convert-to-invoice',headers=h(verified_user)).status_code==422
    other=client.post('/api/businesses',json={"name":"Other Quotes","main_branch_name":"Main","country":"Nigeria","currency":"NGN","default_language":"en"},headers={**h(verified_user),"Idempotency-Key":"quote-other"}).json()['business']['id']
    assert client.get(f'/api/businesses/{other}/quotes/{quote["id"]}',headers=h(verified_user)).status_code==404
    assert client.post(f'/api/businesses/{other}/quotes',json=payload(customer['id'],product['id']),headers=h(verified_user)).status_code==422
    assert client.get(f'/api/businesses/{business}/quotes').status_code==401
