from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool

from app.db.base import Base
from app.api.main import app
from app.api.routers import orders as orders_router

engine = create_engine(
    "sqlite://",
    connect_args={"check_same_thread": False},
    poolclass=StaticPool,
    future=True,
)
TestingSessionLocal = sessionmaker(bind=engine)
Base.metadata.create_all(bind=engine)


def override_get_db():
    db = TestingSessionLocal()
    try:
        yield db
    finally:
        db.close()

app.dependency_overrides[orders_router.get_db] = override_get_db
client = TestClient(app)


def test_create_and_get_order_api():
    payload = {"order_number": "API-ORD-1", "client_id": 1}
    r = client.post("/orders/", json=payload)
    assert r.status_code == 200
    data = r.json()
    assert data["id"] is not None

    order_id = data["id"]
    r2 = client.get(f"/orders/{order_id}")
    assert r2.status_code == 200
    data2 = r2.json()
    assert data2["order_number"] == payload["order_number"]

def test_create_order_item_api():
    # create order first
    r = client.post("/orders/", json={"order_number":"API-ORD-ITEM","client_id":1})
    assert r.status_code == 200
    ord_id = r.json()["id"]

    payload = {"product_variant_id": 1, "quantity": 2}
    r2 = client.post(f"/orders/{ord_id}/items", json=payload)
    assert r2.status_code == 200
    item = r2.json()
    assert item["order_id"] == ord_id
    assert item["quantity"] == 2
