from collections import defaultdict
from decimal import Decimal
from urllib.parse import quote

from app.customers.schemas import (
    PeriodTotal,
    ReceivableTextRequest,
    ReceivableTextResponse,
)


def normalize_whatsapp_phone(phone: str) -> str:
    digits = "".join(character for character in phone if character.isdigit())
    if digits.startswith("0"):
        return f"62{digits[1:]}"
    return digits


def build_whatsapp_url(phone: str, message_text: str) -> str:
    return f"https://wa.me/{normalize_whatsapp_phone(phone)}?text={quote(message_text)}"


def build_receivable_text(
    request: ReceivableTextRequest,
    whatsapp_phone: str | None = None,
) -> ReceivableTextResponse:
    totals: dict[str, Decimal] = defaultdict(Decimal)
    lines = [f"Yth. {request.nama_pelanggan}", "", "Rincian piutang:"]
    for row in request.selected_rows:
        totals[row.periode] += row.total
        lines.append(
            f"{row.tanggal:%d-%m-%Y} | {row.kodesi} | Rp {row.total:,.0f}"
        )
    period_totals = [
        PeriodTotal(periode=periode, total=total)
        for periode, total in sorted(totals.items())
    ]
    grand_total = sum(totals.values(), Decimal("0"))
    lines.extend(["", f"Total: Rp {grand_total:,.0f}"])
    if request.footer:
        lines.extend(["", request.footer])
    return ReceivableTextResponse(
        message_text="\n".join(lines),
        grand_total=grand_total,
        periode_totals=period_totals,
        whatsapp_phone=whatsapp_phone,
    )