from tests.api_client import NZ_15, make_client_product, make_load_in


def _completed_load_out(api):
    cid, pid = make_client_product(api)
    make_load_in(api, cid, pid, 10)
    src = api.get("/api/load-outs/sources", params={"client_id": cid}).json()[0]["id"]
    lo = api.post("/api/load-outs", json={"client_id": cid, "code": "LO-1", "date": NZ_15, "to_location": "Port",
                                          "to_rmp": "R9", "lines": [{"source_item_id": src, "quantity": 3}]}).json()
    api.post(f"/api/load-outs/{lo['id']}/complete")
    return cid, lo["id"]


def test_packing_slip_lifecycle(admin_api):
    cid, lo = _completed_load_out(admin_api)
    assert admin_api.get("/api/packing-slips/defaults").json() == {"from_location": "Flyway", "from_rmp": "S2142"}
    cands = admin_api.get("/api/packing-slips/candidates", params={"client_id": cid}).json()
    assert [c["id"] for c in cands] == [lo]
    body = {"reference": "PS-1", "date": NZ_15, "from_location": "Flyway", "from_rmp": "S2142",
            "to_location": "Port", "to_rmp": "R9", "awb_number": "AWB", "load_out_ids": [lo]}
    slip = admin_api.post("/api/packing-slips", json=body).json()
    assert slip["products"] == [{"product_title": "Kiwi", "batch_number": "B1", "quantity": 3}]
    assert admin_api.get("/api/packing-slips/candidates", params={"client_id": cid}).json() == []
    again = admin_api.get("/api/packing-slips/candidates", params={"slip_id": slip["id"]}).json()
    assert [c["id"] for c in again] == [lo]
    done = admin_api.post(f"/api/packing-slips/{slip['id']}/complete").json()
    assert done["completed"] is not None
    assert admin_api.get("/api/packing-slips", params={"is_completed": True}).json()["total"] == 1
    assert admin_api.post("/api/packing-slips/delete", json={"ids": [slip["id"]]}).status_code == 204
