# edited by glg
import re


class TransaksiBarangInputService:
    # edited by glg
    def _build_missing_harga_message(self, lookup, barang_raw, mode="barcode"):
        barang = barang_raw if isinstance(barang_raw, dict) else {}
        nama = str(barang.get("nama") or "").strip()
        barcode = str(barang.get("barcode") or "").strip()
        identitas = nama or lookup
        if barcode:
            identitas = f"{identitas} (barcode: {barcode})"
        return (
            f"Barang '{identitas}' ditemukan, tetapi harganya belum diatur.\n\n"
            "Langkah yang perlu dilakukan:\n"
            "1. Buka Web Admin.\n"
            "2. Atur harga jual barang tersebut.\n"
            "3. Jalankan sinkronisasi di POS.\n\n"
            "Setelah sinkronisasi selesai, silakan scan ulang barang."
        )

    # edited by glg
    @staticmethod
    def _to_int_safely(value, default=0):
        try:
            parsed = int(str(value).strip())
        except (TypeError, ValueError):
            return int(default or 0)
        return int(parsed)

    def find_barang(self, model, text, barcode_only=False):
        lookup = str(text or "").strip()
        if not lookup:
            return None, ""
        if barcode_only or re.fullmatch(r"\d{5,}", lookup):
            barang = model.cari_barang_by_barcode(lookup)
            if barang:
                return barang, ""
            raw_lookup = None
            if hasattr(model, "cari_barang_by_barcode_raw"):
                raw_lookup = model.cari_barang_by_barcode_raw(lookup)
            if raw_lookup:
                return None, self._build_missing_harga_message(
                    lookup=lookup,
                    barang_raw=raw_lookup,
                    mode="barcode",
                )
            return None, f"Barcode '{lookup}' tidak ditemukan."

        barang = model.cari_barang_by_nama(lookup)
        if barang:
            return barang, ""
        raw_lookup = None
        if hasattr(model, "cari_barang_by_nama_raw"):
            raw_lookup = model.cari_barang_by_nama_raw(lookup)
        if raw_lookup:
            return None, self._build_missing_harga_message(
                lookup=lookup,
                barang_raw=raw_lookup,
                mode="nama",
            )
        return None, f"Barang '{lookup}' tidak ditemukan."

    def resolve_input_qty(self, popup_enabled, input_dialog_callback):
        if popup_enabled:
            jumlah, ok = input_dialog_callback()
            if not ok:
                return False, 0
            return True, self._to_int_safely(jumlah, default=0)
        return True, 1

    def compute_total_qty(self, tambahan_qty, jumlah_lama):
        return int(tambahan_qty or 0) + int(jumlah_lama or 0)

    def is_over_max_qty(self, total_qty, max_qty=99):
        return int(total_qty or 0) > int(max_qty or 99)

    def normalize_manual_qty(self, qty_value):
        qty = self._to_int_safely(qty_value, default=0)
        if qty <= 0:
            return False, 1
        return True, qty
