import datetime as dt

from tests.api_client import NZ_15, make_client_product, make_load_in


def test_load_in_lifecycle(admin_api):
    cid, pid = make_client_product(admin_api)
    li = make_load_in(admin_api, cid, pid, 10, complete=False)
    assert li["is_draft"] and li["items"][0]["remaining_stock"] == 10
    assert dt.datetime.fromisoformat(li["date"]) == dt.datetime(2026, 3, 2, 2, tzinfo=dt.UTC)  # 新西兰 15:00 = UTC 02:00
    edited = admin_api.put(f"/api/load-ins/{li['id']}", json={
        "client_id": cid, "code": "LI-1", "date": NZ_15,
        "lines": [{"id": li["items"][0]["id"], "product_id": pid, "batch_number": "B1", "quantity": 12}]}).json()
    assert edited["items"][0]["quantity"] == 12
    done = admin_api.post(f"/api/load-ins/{li['id']}/complete").json()
    assert not done["is_draft"] and [a["action"] for a in done["audit"]][:1] == ["complete"]
    page = admin_api.get("/api/load-ins", params={"client_id": cid, "is_draft": False, "batch": "b1"}).json()
    assert page["total"] == 1 and page["items"][0]["client_name"] == "Acme"


def test_date_filter_uses_nz_days(admin_api):
    cid, pid = make_client_product(admin_api)
    make_load_in(admin_api, cid, pid, 1)
    assert admin_api.get("/api/load-ins", params={"from_date": "2026-03-02", "to_date": "2026-03-02"}).json()["total"] == 1
    assert admin_api.get("/api/load-ins", params={"from_date": "2026-03-03"}).json()["total"] == 0


def test_naive_date_rejected(admin_api):
    cid, pid = make_client_product(admin_api)
    r = admin_api.post("/api/load-ins", json={"client_id": cid, "code": "X", "date": "2026-03-02T15:00:00",
                                              "lines": [{"product_id": pid, "batch_number": "B", "quantity": 1}]})
    assert r.status_code == 400 and r.json()["field"] == "date"


def test_remaining_picks(admin_api):
    cid, pid = make_client_product(admin_api, default_unit=12, available_unit="6")
    li = make_load_in(admin_api, cid, pid, 5, unit=6)  # 30 不能整除默认 12，退到 6
    picks = admin_api.get(f"/api/load-ins/{li['id']}/remaining").json()
    assert [(p["quantity"], p["unit"], p["remainder"]) for p in picks] == [(5, 6, 0)]
    assert picks[0]["product_title"] == "Kiwi"


def test_staff_cannot_delete(staff_api):
    cid, pid = make_client_product(staff_api)
    li = make_load_in(staff_api, cid, pid, 1, complete=False)
    assert staff_api.post("/api/load-ins/delete", json={"ids": [li["id"]]}).status_code == 403
