from typing import Any, Callable, Dict

# edited by glg


class TransactionExportLegacyDefaultsService:
    @staticmethod
    def _safe_positive_int(value, default=0, as_positive_int_fn: Callable[[Any, int], int] = None) -> int:
        if callable(as_positive_int_fn):
            return int(as_positive_int_fn(value, default))
        try:
            parsed = int(float(value))
        except Exception:
            parsed = int(default or 0)
        return parsed if parsed > 0 else 0

    @staticmethod
    def build_defaults(
        config: Dict[str, Any],
        device_context: Dict[str, Any],
        *,
        machine_fallback: str = "",
        as_positive_int_fn: Callable[[Any, int], int] = None,
    ) -> Dict[str, Any]:
        cfg = config if isinstance(config, dict) else {}
        ctx = device_context if isinstance(device_context, dict) else {}

        resolved_machine = str(ctx.get("machine_id") or machine_fallback or "").strip()
        resolved_print_operator = (
            str(cfg.get("export_default_print_oleh_nama") or "system").strip() or "system"
        )
        resolved_kontainer_size = (
            str(cfg.get("export_default_kontainer_size") or "none").strip() or "none"
        )
        resolved_ekspedisi_status = (
            str(cfg.get("export_default_ekspedisi_status") or "none").strip() or "none"
        )
        resolved_cabang_id = TransactionExportLegacyDefaultsService._safe_positive_int(
            ctx.get("cabang_id"),
            0,
            as_positive_int_fn=as_positive_int_fn,
        )
        resolved_toko_id = TransactionExportLegacyDefaultsService._safe_positive_int(
            ctx.get("toko_id"),
            TransactionExportLegacyDefaultsService._safe_positive_int(
                cfg.get("toko_id"),
                0,
                as_positive_int_fn=as_positive_int_fn,
            ),
            as_positive_int_fn=as_positive_int_fn,
        )

        return {
            "machine_id": resolved_machine,
            "cabang_id": resolved_cabang_id,
            "cabang_nama": str(ctx.get("cabang_nama") or "").strip(),
            "cpu_info": str(ctx.get("cpu_info") or "no-cpuINFO").strip() or "no-cpuINFO",
            "com_info": str(ctx.get("com_info") or "no-comINFO").strip() or "no-comINFO",
            "toko_id": resolved_toko_id,
            "default_print_operator": resolved_print_operator,
            "default_kontainer_size": resolved_kontainer_size,
            "default_ekspedisi_status": resolved_ekspedisi_status,
        }
