"""
순수 로직 단위 테스트 — streamlit 컨텍스트 없이 실행 가능.
실행: python3 test_logic.py
"""

import logic


def test_is_in_window():
    assert logic.is_in_window("2025-06-05", "2025-05-19", "2025-06-16") is True
    assert logic.is_in_window("2025-07-01", "2025-05-19", "2025-06-16") is False
    assert logic.is_in_window("", "2025-05-19", "2025-06-16") is False
    print("PASS test_is_in_window")


def test_schedule_compliance():
    data = logic.load_all()
    summ = logic.schedule_compliance_summary(data["manifest"])
    assert summ["due_rows"] == summ["collected"] + summ["missed"], "due = collected + missed"
    assert 0.0 <= summ["collection_rate"] <= 1.0
    assert summ["window_violations"] >= 0
    print(f"PASS test_schedule_compliance: {summ}")


def test_window_alerts_subset():
    data = logic.load_all()
    alerts = logic.window_alert_list(data["manifest"])
    # 모든 alert 행은 missed 이거나 window 위반
    bad = alerts[(alerts["status"] != "missed") & (alerts["window_violation"] != "yes")]
    assert len(bad) == 0, "alert 목록은 missed 또는 위반만 포함해야 함"
    print(f"PASS test_window_alerts_subset: {len(alerts)} alerts")


def test_custody_completeness():
    data = logic.load_all()
    comp = logic.custody_completeness(data["custody"])
    # VCTE는 collection 1단계만으로 complete여야 함
    vcte = comp[comp["specimen_type"] == "VCTE"]
    assert (vcte["chain_complete"] == "yes").all(), "VCTE는 collection만으로 complete"
    # 물리 검체 complete는 4단계
    phys = comp[(comp["specimen_type"] != "VCTE") & (comp["chain_complete"] == "yes")]
    assert (phys["n_steps"] == 4).all() if len(phys) else True
    print(f"PASS test_custody_completeness: complete={int((comp['chain_complete']=='yes').sum())}")


def test_shipment_qc():
    data = logic.load_all()
    qc = logic.shipment_qc_summary(data["shipment"])
    assert qc["total_shipments"] > 0
    assert 0.0 <= qc["accept_rate"] <= 1.0
    rec = logic.recollection_trigger_list(data["shipment"])
    # rejected면 재채취 trigger
    assert (rec["recollection_triggered"] == "yes").all()
    print(f"PASS test_shipment_qc: {qc['total_shipments']} shipments, accept={qc['accept_rate']}")


def test_turnaround():
    data = logic.load_all()
    ts = logic.turnaround_summary(data["pathology"], target_tat=14)
    assert ts["total_blocks"] == ts["read_complete"] + ts["pending_backlog"]
    assert ts["target_tat_days"] == 14
    bl = logic.pathology_backlog_list(data["pathology"])
    assert len(bl) >= 0
    print(f"PASS test_turnaround: {ts}")


def test_inventory_and_risk():
    data = logic.load_all()
    inv = logic.block_inventory(data["pathology"])
    assert "residual_sections" in inv.columns
    reg = logic.recollection_register(data["manifest"], data["shipment"])
    assert set(["patient_id", "site_id", "visit", "specimen_type", "reason"]).issubset(reg.columns)
    risk = logic.evaluable_loss_risk(data["manifest"], data["shipment"], data["pathology"])
    if len(risk):
        assert (risk["n_risk_factors"] >= 1).all()
    print(f"PASS test_inventory_and_risk: inv={len(inv)}, register={len(reg)}, risk={len(risk)}")


if __name__ == "__main__":
    test_is_in_window()
    test_schedule_compliance()
    test_window_alerts_subset()
    test_custody_completeness()
    test_shipment_qc()
    test_turnaround()
    test_inventory_and_risk()
    print("\nALL TESTS PASSED")
