﻿from pypos.core.utils.db_helper import parse_float_safely


class SettlementViewFormatter:
    NAMA_HARI = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]

    @classmethod
    def resolve_hari(cls, hari):
        try:
            idx = int(hari)
            if 1 <= idx <= 7:
                return cls.NAMA_HARI[idx - 1]
        except (TypeError, ValueError):
            pass
        return str(hari or "-")

    @staticmethod
    def format_info_transaksi(transaksi_data, nilai=None):
        if not transaksi_data:
            return "<i>Info transaksi tidak tersedia</i>"
        data = transaksi_data[0]
        text = (
            f"<b>Tanggal:</b> {data.get('tanggal', '-')} &nbsp; "
            f"<b>Kasir:</b> {data.get('kasir', '-')} &nbsp; "
            f"<b>Jumlah:</b> {data.get('jumlah_transaksi', '-')}"
        )
        if nilai is not None:
            text += f"<br><b>Uang Tunai Disetor:</b> Rp {nilai:,}"
        return text

    @staticmethod
    def format_non_tunai(summary):
        if not summary:
            return "<i>Info non tunai tidak tersedia</i>"
        lines = []
        non_tunai = summary.get("non_tunai", [])
        if non_tunai:
            lines.append("<b>Non-Tunai:</b>")
            for item in non_tunai:
                metode = item.get("metode") or "-"
                jumlah = item.get("jumlah_transaksi", 0) or 0
                total = item.get("total_bayar", 0) or 0
                lines.append(f"- {metode}: {jumlah} transaksi, Rp {total:,.0f}")
        multi = summary.get("multi")
        if multi:
            jumlah = multi.get("jumlah_transaksi", 0) or 0
            total = multi.get("total_bayar", 0) or 0
            lines.append(f"<b>Multi:</b> {jumlah} transaksi, Rp {total:,.0f}")
        return "<br>".join(lines) if lines else "<i>Info non tunai tidak tersedia</i>"

    @staticmethod
    def sanitize_uang_input(text):
        cleaned = ''.join(c for c in str(text or "") if c.isdigit() or c == '.')
        if cleaned.count('.') > 1:
            cleaned = cleaned[:cleaned.rfind('.')]
        return cleaned

    @staticmethod
    def format_preview_nominal(text):
        digits = ''.join(c for c in str(text or "") if c.isdigit())
        if not digits:
            return "Tampilan nominal: Rp -"
        try:
            value = int(digits)
        except ValueError:
            return "Tampilan nominal: Rp -"
        formatted = f"{value:,}".replace(",", ".")
        return f"Tampilan nominal: Rp {formatted}"

    @staticmethod
    def parse_uang_value(text):
        if not str(text or "").strip():
            return 0.0
        return parse_float_safely(text)
