﻿# edited by glg
from pypos.modules.penjualan.services.preorder_api_service import PreorderApiService


class _FakeResponse:
    def __init__(self, payload):
        self._payload = payload

    def json(self):
        return self._payload


def test_preorder_get_list_missing_required_returns_standard_envelope(monkeypatch):
    service = PreorderApiService()

    monkeypatch.setattr(
        service,
        "_resolve_request_identity",
        lambda _user_info: {"kasir_id": "", "kasir_nama": "", "dev_alias": "", "cabang_id": ""},
    )

    result = service.get_preorder_list(user_info={})

    assert int(result.get("status") or 0) == 0
    assert result.get("error_code") == "PREORDER_MISSING_REQUIRED"
    assert str(result.get("reason") or "").startswith("missing_required:")
    assert str(result.get("trace_id") or "").startswith("pre-list-")


def test_preorder_post_form_invalid_json_returns_standard_envelope(monkeypatch):
    service = PreorderApiService()

    monkeypatch.setattr(
        "pypos.modules.penjualan.services.preorder_api_service.build_endpoint_url",
        lambda *args, **kwargs: ("https://example.test/preorder", ""),
    )
    monkeypatch.setattr(
        service,
        "request_with_retry",
        lambda *args, **kwargs: _FakeResponse(payload=["invalid"]),
    )

    result = service._post_form(
        "ep_preorder_get",
        payload={"kasir_id": "1", "kasir_nama": "Kasir", "dev_alias": "POS-1", "cabang_id": "10"},
        trace_id="pre-test-001",
    )

    assert int(result.get("status") or 0) == 0
    assert result.get("error_code") == "PREORDER_INVALID_JSON"
    assert result.get("reason") == "invalid_json"
    assert result.get("trace_id") == "pre-test-001"


def test_preorder_post_form_server_reject_is_normalized(monkeypatch):
    service = PreorderApiService()

    monkeypatch.setattr(
        "pypos.modules.penjualan.services.preorder_api_service.build_endpoint_url",
        lambda *args, **kwargs: ("https://example.test/preorder", ""),
    )
    monkeypatch.setattr(
        service,
        "request_with_retry",
        lambda *args, **kwargs: _FakeResponse(payload={"status": 0, "reason": "unauthorized", "message": "token invalid"}),
    )

    result = service._post_form(
        "ep_preorder_get",
        payload={"kasir_id": "1", "kasir_nama": "Kasir", "dev_alias": "POS-1", "cabang_id": "10"},
        trace_id="pre-test-unauthorized",
    )

    assert int(result.get("status") or 0) == 0
    assert result.get("error_code") == "PREORDER_API_REJECT"
    assert result.get("reason") == "unauthorized"
    assert result.get("trace_id") == "pre-test-unauthorized"
