# edited by glg
from datetime import datetime
from typing import Any, Dict, List


class TransactionExportLegacyPaymentPayloadService:
    """
    Dekomposisi hotspot:
    builder payload payment legacy dipisah dari service utama export.
    """

    def __init__(self, export_service):
        self.export_service = export_service

    def build_payload(
        self,
        transaksi_row: Dict[str, Any],
        id_penjualan: int,
        cabang_id: int,
    ) -> List[Dict[str, Any]]:
        svc = self.export_service
        nominal_bruto = svc._to_int(transaksi_row.get("transaksi_bulat"), 0)
        if nominal_bruto <= 0:
            nominal_bruto = svc._to_int(transaksi_row.get("transaksi_nilai_ori"), 0)
        nominal_tagihan = svc._to_int(transaksi_row.get("transaksi_nilai"), nominal_bruto)
        nominal_bayar = svc._to_int(transaksi_row.get("transaksi_dibayar"), nominal_tagihan)
        nominal_kembali = svc._to_int(
            transaksi_row.get("transaksi_dibayar_return"),
            max(0, nominal_bayar - nominal_tagihan),
        )
        nominal_kurang = max(0, nominal_tagihan - nominal_bayar)
        nominal_lebih = max(0, nominal_bayar - nominal_tagihan)

        discount_source = dict(transaksi_row or {})
        if "_diskon_tambahan_total" not in discount_source:
            discount_source["_diskon_tambahan_total"] = svc._to_int(
                transaksi_row.get("tambahan_nilai"),
                svc._to_int(transaksi_row.get("add_disc"), 0),
            )
        discount = svc._resolve_transaksi_discount_components(
            discount_source,
            diskon_produk_hint=svc._to_int(transaksi_row.get("_diskon_produk_total"), 0),
            bruto_hint=nominal_bruto,
            tagihan_hint=nominal_tagihan,
        )
        diskon_tambahan_nilai = int(max(0, discount.get("diskon_tambahan", 0)))
        diskon_member_nilai = int(max(0, discount.get("diskon_member", 0)))
        diskon_produk_nilai = int(max(0, discount.get("diskon_produk", 0)))
        if nominal_bruto > 0 and diskon_tambahan_nilai > 0:
            diskon_tambahan_persen = (float(diskon_tambahan_nilai) / float(nominal_bruto)) * 100.0
        else:
            diskon_tambahan_persen = 0.0

        nominal_non_tunai = svc._to_float(transaksi_row.get("pembayaran_non_tunai"), 0.0)
        is_non_tunai = nominal_non_tunai > 0.0
        metode = str(transaksi_row.get("bank_nama") or "").strip().lower()
        if not metode:
            metode = "non cash" if is_non_tunai else "cash"

        account_id_default = 110 if is_non_tunai else 108
        account_name_default = "Non Tunai" if is_non_tunai else "Tunai"
        nomor_kartu = str(transaksi_row.get("kartu_nomer") or "").strip() or None
        nomor_referensi = (
            str(transaksi_row.get("nomer_ep") or transaksi_row.get("referensi_nomer") or "").strip()
            or None
        )
        dtime_val = svc._normalize_dtime_value(
            transaksi_row.get("dtime"),
            datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        )

        return [
            {
                "id_penjualan": int(id_penjualan),
                "nomer": str(transaksi_row.get("nomer") or ""),
                "metode_pembayaran": metode,
                "nilai_bruto": int(max(0, nominal_bruto)),
                "nilai_tagihan": int(max(0, nominal_tagihan)),
                "nilai_bayar": int(max(0, nominal_bayar)),
                "nilai_terbayar": int(max(0, nominal_bayar)),
                "nilai_kurang_bayar": int(max(0, nominal_kurang)),
                "nilai_lebih_bayar": int(max(0, nominal_lebih if nominal_lebih > 0 else nominal_kembali)),
                "diskon_persen": float(max(0.0, diskon_tambahan_persen)),
                "diskon_rp": int(max(0, diskon_tambahan_nilai)),
                "diskon_tambahan_persen": float(max(0.0, diskon_tambahan_persen)),
                "diskon_tambahan_nilai": int(max(0, diskon_tambahan_nilai)),
                "diskon_produk": int(max(0, diskon_produk_nilai)),
                "diskon_member": int(max(0, diskon_member_nilai)),
                "total_diskon_produk": int(max(0, diskon_produk_nilai)),
                "total_diskon_member": int(max(0, diskon_member_nilai)),
                "total_diskon_tambahan": int(max(0, diskon_tambahan_nilai)),
                "bank_id": str(transaksi_row.get("bank_id") or ""),
                "bank_nama": str(transaksi_row.get("bank_nama") or ""),
                "account_id": str(svc._to_int(transaksi_row.get("bank_rekening_id"), account_id_default)),
                "account_nama": str(transaksi_row.get("bank_rekening_nama") or account_name_default),
                "bank_tujuan": None,
                "rekening_tujuan": None,
                "nomor_kartu": nomor_kartu,
                "nama_pemilik_kartu": None,
                "nomor_referensi": nomor_referensi,
                "cabang_id": str(svc._to_int(cabang_id, 0)),
                "gudang_id": int(svc._to_int(transaksi_row.get("gudang_id"), 0)),
                "kasir_id": str(svc._to_int(transaksi_row.get("oleh_id"), 0)),
                "dtime": dtime_val,
                "is_return": int(
                    max(
                        svc._to_int(transaksi_row.get("returned"), 0),
                        svc._to_int(transaksi_row.get("returns"), 0),
                    )
                ),
                "return_notes": None,
                "return_methode": None,
            }
        ]
