import pytest
from fastapi.testclient import TestClient
from app.api.main import app

client = TestClient(app)

def test_e2e_order_flow():
    # create a product
    prod_resp = client.post('/products', json={'name': 'Test Shirt', 'base_price': 12.5})
    assert prod_resp.status_code == 200
    prod = prod_resp.json()

    # create a variant
    var_payload = {'product_id': prod['id'], 'name': 'Talla M'}
    var_resp = client.post(f"/products/{prod['id']}/variants", json=var_payload)
    assert var_resp.status_code == 200
    variant = var_resp.json()

    # create a client (unique cedula per test run)
    import time
    cedula = str(int(time.time() * 1000))[:10]
    client_resp = client.post('/clients/', json={'cedula': cedula, 'full_name': 'Cliente E2E'})
    assert client_resp.status_code == 200
    c = client_resp.json()

    # create an order with items
    order_payload = {
        'client_id': c['id'],
        'items': [
            {'product_variant_id': variant['id'], 'quantity': 2}
        ]
    }
    oresp = client.post('/orders/', json=order_payload)
    assert oresp.status_code == 200
    o = oresp.json()
    assert 'order_number' in o

    # search by order number
    sn = client.get(f"/orders/search/{o['order_number']}")
    assert sn.status_code == 200

    # search by cedula
    sc = client.get(f"/orders/search/cedula/{cedula}")
    assert sc.status_code == 200
    list_orders = sc.json()
    assert any(ord['id'] == o['id'] for ord in list_orders)

    # update order status
    up = client.put(f"/orders/{o['id']}", json={'status': 'sublimando'})
    assert up.status_code == 200
    assert up.json()['status'] == 'sublimando'

    # delete order
    d = client.delete(f"/orders/{o['id']}")
    assert d.status_code == 200
