# edited by glg
from pypos.modules.penjualan.models.detail_transaksi_model import DetailTransaksi
from pypos.modules.penjualan.services.transaksi_preorder_service import TransaksiPreorderService


def test_prepare_save_payload_sets_label_and_extends_transaksi_data():
    service = TransaksiPreorderService()
    transaksi_data = ["INV-1", "2026-03-01 10:00:00", 10000]
    detail_data = [
        DetailTransaksi(
            produk_id=1,
            produk_nama="Produk A",
            produk_ord_hrg=5000,
            produk_ord_jml=2,
            produk_jenis="invoice",
            produk_ord_diskon=0,
            satuan="PCS",
        )
    ]
    saved_transaksi, saved_detail = service.prepare_save_payload(transaksi_data, detail_data)
    assert isinstance(saved_transaksi, list)
    assert len(saved_transaksi) >= 14
    assert saved_transaksi[11] == "simpan_transaksi"
    assert saved_detail[0].produk_jenis == "simpan_transaksi"


def test_prepare_save_payload_returns_none_when_transaksi_data_empty():
    service = TransaksiPreorderService()
    saved_transaksi, saved_detail = service.prepare_save_payload([], [])
    assert saved_transaksi is None
    assert saved_detail is None


def test_build_restore_payload_handles_invalid_detail_rows():
    service = TransaksiPreorderService()
    payload = {
        "transaksi_id": 999,
        "transaksi": {
            "nomer": "INV-999",
            "dtime": "2026-03-01 11:00:00",
            "transaksi_nilai": 22000,
            "diskon_persen": 0,
            "ppn_persen": 11,
            "customers_id": 2,
            "customers_nama": "Customer Test",
            "oleh_id": 7,
            "oleh_nama": "kasir",
            "jenis_label": "simpan_transaksi",
        },
    }
    # Row kedua invalid (kurang kolom) -> harus di-skip, bukan crash.
    detail_rows = [
        (10, "Produk A", 11000, 2, 0, "PCS"),
        (20, "Produk B", 9000),
    ]
    restored = service.build_restore_payload(payload, detail_rows)
    assert restored is not None
    assert restored["nomer"] == "INV-999"
    assert restored["transaksi_id"] == 999
    assert len(restored["detail_data"]) == 1
    assert restored["detail_data"][0].produk_jenis == "simpan_transaksi"


def test_build_restore_payload_returns_none_when_preorder_payload_missing():
    service = TransaksiPreorderService()
    assert service.build_restore_payload(None, []) is None
    assert service.build_restore_payload({}, []) is None
