# edited by glg
from pypos.modules.penjualan.services.settlement_view_data_service import SettlementViewDataService


class SettlementHistoryReprintService:
    """
    Service khusus reprint nota settlement dari data history.
    Controller cukup memanggil execute() agar orchestration tetap modular.
    """

    def __init__(self, settlement_model, print_controller, view_data_service=None):
        self._model = settlement_model
        self._print_controller = print_controller
        self._view_data_service = view_data_service or SettlementViewDataService()

    @staticmethod
    def _to_float(value, default=0.0):
        try:
            return float(value or 0)
        except (TypeError, ValueError):
            return float(default)

    @staticmethod
    def _as_counter_date(raw_value):
        text = str(raw_value or "").strip()
        if len(text) >= 10:
            return text[:10].replace("-", "")
        return ""

    def _build_counter(self, history_data, transaksi_ids, detail_transaksi):
        candidate = str((history_data or {}).get("counter") or "").strip()
        if candidate:
            return candidate

        date_key = self._as_counter_date((history_data or {}).get("tanggal"))
        if not date_key:
            first_dtime = str((detail_transaksi or [{}])[0].get("dtime") or "").strip()
            date_key = self._as_counter_date(first_dtime)
        if not date_key:
            date_key = "00000000"

        try:
            first_id = int((transaksi_ids or [0])[0] or 0)
        except (TypeError, ValueError):
            first_id = 0
        return f"ST-RP-{date_key}-{first_id:03d}"

    def execute(self, history_data):
        payload = history_data if isinstance(history_data, dict) else {}
        transaksi_ids = self._view_data_service.extract_transaksi_ids(payload.get("data_transaksi_id"))
        if not transaksi_ids:
            return {
                "ok": False,
                "message": "Data transaksi untuk print ulang settlement tidak tersedia.",
            }

        total_dict = self._model.hitung_total_per_metode_by_ids(transaksi_ids) or {}
        detail_transaksi = self._model.get_transaksi_by_ids(transaksi_ids) or []
        if not detail_transaksi:
            return {
                "ok": False,
                "message": "Transaksi settlement tidak ditemukan untuk print ulang.",
            }

        counter = self._build_counter(payload, transaksi_ids, detail_transaksi)
        kasir_nama = str(payload.get("kasir") or detail_transaksi[0].get("oleh_nama") or "-").strip() or "-"
        admin_nama = str(payload.get("admin") or "-").strip() or "-"
        total_disetor = self._to_float(payload.get("total_disetor"), 0.0)

        print_ok = bool(
            self._print_controller.print_settlement(
                counter=counter,
                kasir_nama=kasir_nama,
                shift="-",
                total_dict=total_dict,
                transaksi_list=detail_transaksi,
                admin_nama=admin_nama,
                total_disetor=total_disetor,
            )
        )
        if not print_ok:
            return {
                "ok": False,
                "message": "Print ulang nota settlement gagal. Periksa printer lalu coba lagi.",
                "counter": counter,
            }

        return {
            "ok": True,
            "message": f"Print ulang nota settlement berhasil.\nID: {counter}",
            "counter": counter,
        }
