from fastapi.testclient import TestClient
from sqlalchemy import create_engine, text
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_release_and_finalize_order_api():
    # create inventory and product/variant
    db = TestingSessionLocal()
    inv = db.execute(text("insert into inventory_items (name, type, quantity_on_hand) values ('Papel','paper', 20)"))
    db.commit()

    # create product and variant
    db.execute(text("insert into products (name) values ('ProdX')"))
    db.execute(text("insert into product_variants (product_id, name) values (1, 'V1')"))
    db.commit()

    # create product_component linking variant 1 to inventory 1 with qty 2
    db.execute(text("insert into product_components (product_variant_id, inventory_item_id, qty_per_unit, unit) values (1,1,2,'hoja')"))
    db.commit()

    # create order
    r = client.post('/orders/', json={"order_number":"ORD-API-REL","client_id":1})
    oid = r.json()['id']

    # create item -> reserves 2
    r2 = client.post(f'/orders/{oid}/items', json={"product_variant_id":1, "quantity":2})
    assert r2.status_code == 200

    # release all
    r3 = client.post(f'/orders/{oid}/release')
    assert r3.status_code == 200
    assert r3.json()['released'] >= 1

    # finalize (should find zero to finalize now)
    r4 = client.post(f'/orders/{oid}/finalize')
    assert r4.status_code == 200

