from __future__ import annotations

"""Common constants, decimal converters, and text formatters."""


import re
from datetime import datetime
from decimal import ROUND_HALF_UP, Decimal
from typing import Any

DSCONS_DEFAULT_TAX_CODE = "0202111150"
DSCONS_DEFAULT_COMPANY_NAME = "CÔNG TY TNHH XÂY DỰNG ĐỊNH SƠN"


def to_decimal(val: Any, default: Decimal = Decimal("0.0000")) -> Decimal:
    """Safe conversion to Decimal with 4 decimal places."""
    if val is None:
        return default
    if isinstance(val, (int, float)):
        return Decimal(str(val)).quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
    if isinstance(val, str):
        cleaned = re.sub(r"[^\d.-]", "", val.strip())
        if not cleaned:
            return default
        try:
            return Decimal(cleaned).quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
        except Exception:
            return default
    if isinstance(val, Decimal):
        return val.quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
    return default


def clean_signer_info(
    signed_by: str | None, signed_at: str | None, seller_name: str | None
) -> tuple[str, str]:
    """Clean signer information and format signing date."""
    final_signer = (signed_by or "").strip()
    if not final_signer and seller_name:
        final_signer = seller_name.strip()

    if final_signer:
        match_cn = re.search(r"CN=([^,]+)", final_signer, re.IGNORECASE)
        if match_cn:
            final_signer = match_cn.group(1).strip()
        final_signer = re.sub(r"^[0-9_ -]+", "", final_signer).strip()
        if "CÔNG TY" in final_signer.upper() or "DOANH NGHIỆP" in final_signer.upper():
            final_signer = f"{final_signer} (Chứng thư số Hợp lệ)"
        elif not final_signer.endswith("(Chữ ký số)"):
            final_signer = f"{final_signer} (Chữ ký số)"

    final_signed_date = ""
    if signed_at:
        try:
            s_clean = signed_at.replace("Z", "+00:00")
            dt = datetime.fromisoformat(s_clean)
            final_signed_date = dt.strftime("%d/%m/%Y %H:%M")
        except Exception:
            final_signed_date = signed_at.strip()

    return final_signer, final_signed_date
