def test_client_crud_and_stock(admin_api):
    r = admin_api.post("/api/clients", json={"name": "Acme", "email": "a@x"})
    assert r.status_code == 200, r.text
    cid = r.json()["id"]
    assert admin_api.put(f"/api/clients/{cid}", json={"name": "Acme Ltd"}).json()["name"] == "Acme Ltd"
    detail = admin_api.get(f"/api/clients/{cid}").json()
    assert detail["stock"] == []
    page = admin_api.get("/api/clients", params={"keyword": "acme", "page_size": 10}).json()
    assert page["total"] == 1 and page["items"][0]["id"] == cid
    assert admin_api.post("/api/clients/delete", json={"ids": [cid]}).status_code == 204


def test_keyword_wildcards_are_literal(admin_api):
    admin_api.post("/api/clients", json={"name": "100% Organic"})
    admin_api.post("/api/clients", json={"name": "1000 Farms"})
    names = [c["name"] for c in admin_api.get("/api/clients", params={"keyword": "100%"}).json()["items"]]
    assert names == ["100% Organic"]


def test_page_size_and_sort_validated(admin_api):
    assert admin_api.get("/api/clients", params={"page_size": 7}).status_code == 422
    assert admin_api.get("/api/clients", params={"sort": "nope"}).status_code == 422


def test_product_and_batch(admin_api):
    p = admin_api.post("/api/products", json={"title": "Kiwi", "default_unit": 6, "available_unit": "12"}).json()
    assert p["units"] == [6, 12]
    bad = admin_api.post("/api/products", json={"title": "X", "default_unit": 6, "available_unit": "10"})
    assert bad.status_code == 400 and bad.json()["field"] == "available_unit"
    bt = admin_api.post("/api/batches", json={"product_id": p["id"], "number": "B1", "date": "2026-01-02"}).json()
    assert bt["product_title"] == "Kiwi" and bt["stock"] == 0
    rows = admin_api.get("/api/batches", params={"product_id": p["id"]}).json()["items"]
    assert [r["number"] for r in rows] == ["B1"]


def test_staff_cannot_use_admin_endpoints(staff_api):
    assert staff_api.get("/api/suppliers").status_code == 403
    cid = staff_api.post("/api/clients", json={"name": "C"}).json()["id"]
    assert staff_api.post("/api/clients/delete", json={"ids": [cid]}).status_code == 403


def test_supplier_admin_crud(admin_api):
    s = admin_api.post("/api/suppliers", json={"name": "Farm", "rmp_number": "R1"}).json()
    assert admin_api.get("/api/suppliers", params={"keyword": "r1"}).json()["total"] == 1
    assert admin_api.post("/api/suppliers/delete", json={"ids": [s["id"]]}).status_code == 204
