from tests.api_client import NZ_15, make_client_product, make_load_in


def _load_out(api, cid, src, qty, code="LO-1", **extra):
    body = {"client_id": cid, "code": code, "date": NZ_15, "to_location": "Port", "to_rmp": "R9",
            "lines": [{"source_item_id": src, "quantity": qty}], **extra}
    r = api.post("/api/load-outs", json=body)
    assert r.status_code == 200, r.text
    return r.json()


def test_defaults_come_from_settings(admin_api):
    assert admin_api.get("/api/load-outs/defaults").json() == {"transport_company": "Flyway",
                                                               "vehicle_registration": "DPB105"}


def test_sources_and_lifecycle(admin_api):
    cid, pid = make_client_product(admin_api)
    li = make_load_in(admin_api, cid, pid, 10)
    sources = admin_api.get("/api/load-outs/sources", params={"client_id": cid}).json()
    src = sources[0]
    assert (src["load_in_code"], src["remaining_stock"], src["product_title"]) == ("LI-1", 10, "Kiwi")
    lo = _load_out(admin_api, cid, src["id"], 4, load_in_ids=[li["id"]])
    assert lo["load_ins"] == [{"id": li["id"], "code": "LI-1"}]
    done = admin_api.post(f"/api/load-outs/{lo['id']}/complete").json()
    assert done["items"][0]["source_remaining"] == 6


def test_sources_for_editing_completed_load_out_include_own_quantity(admin_api):
    cid, pid = make_client_product(admin_api)
    make_load_in(admin_api, cid, pid, 10)
    src = admin_api.get("/api/load-outs/sources", params={"client_id": cid}).json()[0]["id"]
    lo = _load_out(admin_api, cid, src, 10)
    admin_api.post(f"/api/load-outs/{lo['id']}/complete")
    assert admin_api.get("/api/load-outs/sources", params={"client_id": cid}).json() == []
    editing = admin_api.get("/api/load-outs/sources", params={"client_id": cid, "transfer_id": lo["id"]}).json()
    assert [(s["id"], s["available"]) for s in editing] == [(src, 10)]


def test_pack_filter_and_unpack(admin_api):
    cid, pid = make_client_product(admin_api)
    make_load_in(admin_api, cid, pid, 10)
    src = admin_api.get("/api/load-outs/sources", params={"client_id": cid}).json()[0]["id"]
    lo = _load_out(admin_api, cid, src, 1)
    assert admin_api.post("/api/load-outs/pack", json={"ids": [lo["id"]], "reference": "PS-1"}).status_code == 400
    admin_api.post(f"/api/load-outs/{lo['id']}/complete")
    assert admin_api.post("/api/load-outs/pack", json={"ids": [lo["id"]], "reference": "PS-1"}).status_code == 204
    packed = admin_api.get("/api/load-outs", params={"is_packed": True}).json()["items"]
    assert packed[0]["packing_slip_reference"] == "PS-1"
    admin_api.post("/api/load-outs/unpack", json={"ids": [lo["id"]]})
    assert admin_api.get("/api/load-outs", params={"is_packed": True}).json()["total"] == 0
