"""
Module: hkd_tax.py
Description: Tính toán thuế GTGT và TNCN cho Hộ kinh doanh (HKD) theo quy định 2026.
Căn cứ: Thông tư 40/2021/TT-BTC (Phụ lục I) + Luật 109/2025/QH15 + Luật 48/2024/QH15
Ngưỡng miễn thuế: 500 triệu đồng/năm (Nâng từ 200 triệu — Luật 109/2025/QH15)
"""

from typing import Dict

# ══════════════════════════════════════════════════════════════════════════════
# BIỂU THUẾ NGÀNH NGHỀ — Thông tư 40/2021/TT-BTC (Phụ lục I)
# Mã ngành: [GTGT%, TNCN%]
# ══════════════════════════════════════════════════════════════════════════════

INDUSTRY_RATES = {
    # == 1. Phân phối, cung cấp hàng hóa ==
    "1_phan_phoi": [1.0, 0.5], # Bán buôn, bán lẻ hàng hóa
    "1_thuong_hotro": [1.0, 0.5], # Thưởng, hỗ trợ đạt doanh số, khuyến mại
    "1_kchiu_gtgt": [0.0, 0.5], # Phân phối hàng không chịu thuế GTGT / 0%
    "1_hoptac": [0.0, 0.5], # Hợp tác kinh doanh (tổ chức đã khai GTGT)
    "1_thuong_kchiu": [0.0, 0.5], # Thưởng, hỗ trợ gắn với hàng không chịu GTGT
    "1_boithuong": [0.0, 0.5], # Bồi thường vi phạm hợp đồng

    # == 2. Dịch vụ, xây dựng không bao thầu nguyên vật liệu ==
    "2_dichvu_5_2": [5.0, 2.0], # Lưu trú, bốc xếp, bưu chính, môi giới, tư vấn, massage, xây dựng ko bao thầu...
    "2_kchiu_gtgt": [0.0, 2.0], # Dịch vụ không chịu thuế GTGT / 0%
    "2_hoptac": [0.0, 2.0], # Hợp tác kinh doanh (tổ chức đã khai GTGT)
    "2_boithuong": [0.0, 2.0], # Bồi thường vi phạm hợp đồng (dịch vụ)
    "2_chothuets": [5.0, 5.0], # Cho thuê tài sản (nhà, đất, xe, máy móc)
    "2_daily": [0.0, 5.0], # Đại lý xổ số, bảo hiểm, đa cấp (chỉ chịu TNCN 5%)
    "2_boithuong_ts": [0.0, 5.0], # Bồi thường (cho thuê tài sản/đại lý)

    # == 3. Sản xuất, vận tải, dịch vụ có gắn với hàng hóa, XD có bao thầu ==
    "3_sanxuat_3_15": [3.0, 1.5], # Sản xuất, vận tải, ăn uống, bảo dưỡng, XD có bao thầu
    "3_kchiu_gtgt": [0.0, 1.5], # Hoạt động không chịu thuế GTGT / 0%
    "3_hoptac": [0.0, 1.5], # Hợp tác kinh doanh (tổ chức đã khai GTGT)

    # == 4. Hoạt động kinh doanh khác ==
    "4_sx_dv_khac": [2.0, 1.0], # Sản xuất/Dịch vụ thuộc đối tượng GTGT 5%
    "4_khac": [2.0, 1.0], # Các hoạt động khác chưa liệt kê

    # == Undefined ==
    "khong_xac_dinh": [0.0, 0.0],
}

# Tên hiển thị thân thiện cho người dùng trong dropdown UI (Grouped)
INDUSTRY_NAMES = {
    # 1. Phân phối
    "1_phan_phoi": "[Nhóm 1] Bán buôn, bán lẻ hàng hóa (GTGT 1% - TNCN 0.5%)",
    "1_thuong_hotro": "[Nhóm 1] Thưởng, hỗ trợ, chiết khấu thương mại (GTGT 1% - TNCN 0.5%)",
    "1_kchiu_gtgt": "[Nhóm 1] Hàng hóa không chịu thuế GTGT/0% (GTGT 0% - TNCN 0.5%)",
    "1_hoptac": "[Nhóm 1] Tách riêng: Hợp tác kinh doanh (TC đã khai GTGT) (GTGT 0% - TNCN 0.5%)",
    "1_thuong_kchiu": "[Nhóm 1] Thưởng, hỗ trợ hàng không chịu GTGT (GTGT 0% - TNCN 0.5%)",
    "1_boithuong": "[Nhóm 1] Bồi thường vi phạm hợp đồng (GTGT 0% - TNCN 0.5%)",

    # 2. Dịch vụ
    "2_dichvu_5_2": "[Nhóm 2] Dịch vụ, tắm hơi, massage, tư vấn, XD ko bao thầu... (GTGT 5% - TNCN 2%)",
    "2_kchiu_gtgt": "[Nhóm 2] Dịch vụ không chịu thuế GTGT/0% (GTGT 0% - TNCN 2%)",
    "2_hoptac": "[Nhóm 2] Tách riêng: Hợp tác kinh doanh (TC đã khai GTGT) (GTGT 0% - TNCN 2%)",
    "2_boithuong": "[Nhóm 2] Bồi thường vi phạm hợp đồng DV (GTGT 0% - TNCN 2%)",
    "2_chothuets": "[Nhóm 2] Cho thuê tài sản: nhà, đất, xe, máy (GTGT 5% - TNCN 5%)",
    "2_daily": "[Nhóm 2] Đại lý xổ số, bảo hiểm, đa cấp (GTGT 0% - TNCN 5%)",
    "2_boithuong_ts": "[Nhóm 2] Bồi thường vi phạm (thuê tài sản/đại lý) (GTGT 0% - TNCN 5%)",

    # 3. Sản xuất / Bao thầu
    "3_sanxuat_3_15": "[Nhóm 3] Sản xuất, vận tải, ăn uống, sửa chữa, XD có bao thầu (GTGT 3% - TNCN 1.5%)",
    "3_kchiu_gtgt": "[Nhóm 3] Hoạt động không chịu thuế GTGT/0% (GTGT 0% - TNCN 1.5%)",
    "3_hoptac": "[Nhóm 3] Tách riêng: Hợp tác kinh doanh (TC đã khai GTGT) (GTGT 0% - TNCN 1.5%)",

    # 4. Khác
    "4_sx_dv_khac": "[Nhóm 4] Hoạt động SX/DV thuộc đối tượng GTGT 5% (GTGT 2% - TNCN 1%)",
    "4_khac": "[Nhóm 4] Hoạt động khác chưa được liệt kê ở 3 nhóm trên (GTGT 2% - TNCN 1%)",

    "khong_xac_dinh": "Tỷ lệ % tính thuế GTGT, TNCN tuỳ chỉnh (Nhập tay)",
}

# Tên hiển thị đầy đủ (6 nhóm) dành cho form chọn Nhóm hàng / Ngành nghề
SIMPLE_INDUSTRY_NAMES = {
    "nhom_1_5": (
        "Nhóm 1 — 1.5%  │  Phân phối, cung cấp hàng hóa "
        "(Bán buôn, bán lẻ; tạp hóa; siêu thị mini; cửa hàng vật tư; bán hàng thương mại trực tuyến)"
    ),
    "nhom_7": (
        "Nhóm 2 — 7%    │  Dịch vụ thuần túy, lưu trú, xây dựng không bao thầu nguyên vật liệu "
        "(Lưu trú; masage; cắt tóc; giặt là; tư vấn pháp luật/tài chính/kế toán; công nghệ thông tin; viễn thông)"
    ),
    "nhom_4_5": (
        "Nhóm 3 — 4.5%  │  Sản xuất, vận tải, dịch vụ gắn hàng hóa, xây dựng có bao thầu nguyên vật liệu "
        "(Nhà hàng, quán ăn, cà phê; sản xuất-gia công-chế biến; vận tải hàng hóa và hành khách; sửa chữa có thay linh kiện)"
    ),
    "nhom_10": (
        "Nhóm 4 — 10%   │  Cho thuê tài sản "
        "(Cho thuê nhà, đất, cửa hàng, nhà xưởng, kho bãi; cho thuê máy móc, thiết bị, phương tiện vận tải không kèm người lái)"
    ),
    "nhom_3": (
        "Nhóm 5 — 3%    │  Kinh doanh khác, dịch vụ chịu thuế GTGT 5% "
        "(Nông-lâm-thủy sản qua chế biến; thiết bị y tế; nước sạch; sách giáo dục; dịch vụ chịu thuế GTGT 5%)"
    ),
    "khong_xac_dinh": (
        "Nhóm 6 — Tùy chỉnh / Ngoại lệ "
        "(Hàng hóa-dịch vụ không chịu thuế GTGT hoặc thuế suất 0%; bồi thường vi phạm hợp đồng; → Nhập tay tỷ lệ % thuế phù hợp)"
    ),
}

# ══════════════════════════════════════════════════════════════════════════════
# NHÓM DOANH THU — Luật 109/2025/QH15 (hiệu lực 01/01/2026)
# ══════════════════════════════════════════════════════════════════════════════

# Ngưỡng doanh thu miễn thuế (VND/năm)
REVENUE_THRESHOLD = 500_000_000  # 500 triệu — nâng từ 200 triệu

TAX_GROUPS = [
    {"group": 1, "label": "Nhóm 1", "desc": "≤ 500 triệu/năm",    "min": 0,               "max": 500_000_000},
    {"group": 2, "label": "Nhóm 2", "desc": "500tr – 3 tỷ/năm",  "min": 500_000_001,      "max": 3_000_000_000},
    {"group": 3, "label": "Nhóm 3", "desc": "3 tỷ – 50 tỷ/năm",  "min": 3_000_000_001,    "max": 50_000_000_000},
    {"group": 4, "label": "Nhóm 4", "desc": "> 50 tỷ/năm",        "min": 50_000_000_001,   "max": float("inf")},
]


def get_tax_group(revenue: float) -> dict:
    """Trả về nhóm doanh thu (1-4) theo quy định 2026."""
    for g in TAX_GROUPS:
        if g["min"] <= revenue <= g["max"]:
            return g
    return TAX_GROUPS[-1]


def get_industry_group_label(industry_code: str) -> str:
    """Trả về tên nhóm Phụ lục I của ngành nghề."""
    if industry_code == "khong_xac_dinh":
        return "Tỷ lệ không xác định (Nhập tay)"
    return INDUSTRY_NAMES.get(industry_code, "Không xác định")


def calculate_hkd_tax(revenue: float, industry_code: str, cost: float = 0.0, custom_gtgt_rate: float = 0.0, custom_tncn_rate: float = 0.0) -> Dict:
    """
    Tính toán thuế phải nộp cho HKD theo quy định 2026.

    Args:
        revenue: Tổng doanh thu trong kỳ (VND/năm)
        industry_code: Mã ngành
        cost: Tổng chi phí hợp lý (dùng cho phương pháp kê khai lợi nhuận)
        custom_gtgt_rate: Tỷ lệ GTGT tùy chỉnh
        custom_tncn_rate: Tỷ lệ TNCN tùy chỉnh

    Returns:
        Dict chứa đầy đủ thông tin thuế
    """
    if industry_code not in INDUSTRY_RATES:
        raise ValueError(f"Mã ngành '{industry_code}' không hợp lệ. Chọn một trong: {list(INDUSTRY_RATES.keys())}")

    if industry_code == "khong_xac_dinh":
        gtgt_rate = custom_gtgt_rate
        default_tncn_rate = custom_tncn_rate
    else:
        gtgt_rate, default_tncn_rate = INDUSTRY_RATES[industry_code]
    is_exempt = revenue <= REVENUE_THRESHOLD
    tax_group = get_tax_group(revenue)

    # ── MIỄN THUẾ ─────────────────────────────────────────────────────────
    if is_exempt:
        return {
            "revenue": revenue,
            "cost": cost,
            "profit": 0.0,
            "industry": industry_code,
            "industry_name": INDUSTRY_NAMES.get(industry_code, industry_code),
            "industry_group": get_industry_group_label(industry_code),
            "gtgt_rate": gtgt_rate,
            "tncn_rate": 0.0,
            "gtgt_due": 0.0,
            "tncn_due": 0.0,
            "total_due": 0.0,
            "is_exempt": True,
            "tax_group": tax_group,
            "method": "Miễn thuế",
            "note": (
                f"Doanh thu ≤ {REVENUE_THRESHOLD:,.0f}đ/năm — MIỄN thuế GTGT và TNCN.\n"
                f"Chỉ cần nộp Thông báo dự kiến doanh thu trước ngày 31/01 hàng năm."
            ),
        }

    # ── TÍNH THUẾ NHÓM 1 (≤ 500tr hoặc vượt) ────────────────────────────
    # Luật 109/2025/QH15: chỉ tính thuế trên phần vượt 500 triệu
    if tax_group["group"] == 1 or revenue <= REVENUE_THRESHOLD * 2:
        # Nhóm 1 hoặc doanh thu sát ngưỡng — áp dụng công thức vượt ngưỡng
        taxable = max(0.0, revenue - REVENUE_THRESHOLD)
        gtgt_due  = taxable * (gtgt_rate / 100)
        tncn_due  = taxable * (default_tncn_rate / 100)
        actual_tncn_rate = default_tncn_rate
        method = f"Tỷ lệ % phần vượt {REVENUE_THRESHOLD/1_000_000:.0f}tr"
    else:
        # ── TÍNH THUẾ GTGT: phần vượt ngưỡng ────────────────────────────────
        taxable  = max(0.0, revenue - REVENUE_THRESHOLD)
        gtgt_due = taxable * (gtgt_rate / 100)

        # ── TÍNH THUẾ TNCN ────────────────────────────────────────────────────
        profit = max(0.0, revenue - cost)
        tncn_due = 0.0
        actual_tncn_rate = 0.0
        method = ""

        if tax_group["group"] == 2:
            if cost > 0:
                actual_tncn_rate = 15.0
                tncn_due = profit * (actual_tncn_rate / 100)
                method = "Kê khai Lợi nhuận (15%)"
            else:
                actual_tncn_rate = default_tncn_rate
                tncn_due = taxable * (actual_tncn_rate / 100)
                method = "Tỷ lệ % doanh thu vượt ngưỡng"
        elif tax_group["group"] == 3:
            actual_tncn_rate = 17.0
            tncn_due = profit * (actual_tncn_rate / 100)
            method = "Kê khai Lợi nhuận (17%)"
        elif tax_group["group"] == 4:
            actual_tncn_rate = 20.0
            tncn_due = profit * (actual_tncn_rate / 100)
            method = "Kê khai Lợi nhuận (20%)"

    taxable_base = max(0.0, revenue - REVENUE_THRESHOLD)
    return {
        "revenue":        revenue,
        "cost":           cost,
        "profit":         max(0.0, revenue - cost),
        "taxable":        taxable_base,
        "exempt_amount":  min(revenue, REVENUE_THRESHOLD),
        "industry":       industry_code,
        "industry_name":  INDUSTRY_NAMES.get(industry_code, industry_code),
        "industry_group": get_industry_group_label(industry_code),
        "gtgt_rate":      gtgt_rate,
        "tncn_rate":      actual_tncn_rate,
        "gtgt_due":       gtgt_due,
        "tncn_due":       tncn_due,
        "total_due":      gtgt_due + tncn_due,
        "is_exempt":      False,
        "tax_group":      tax_group,
        "method":         method,
        "note": (
            f"Ngành: {get_industry_group_label(industry_code)}\n"
            f"Phần được miễn: {min(revenue, REVENUE_THRESHOLD):,.0f}đ\n"
            f"Phần chịu thuế: {taxable_base:,.0f}đ\n"
            f"GTGT {gtgt_rate}%: {gtgt_due:,.0f}đ  |  TNCN {actual_tncn_rate}%: {tncn_due:,.0f}đ\n"
            f"Phương pháp: {method}"
        ),
    }


def calculate_nhom1_annual(annual_revenue: float) -> dict:
    """
    Tính thuế Nhóm 1 (bán lẻ hàng hóa) theo Luật 109/2025/QH15.
    Chỉ tính thuế phần doanh thu vượt 500 triệu/năm.

    Args:
        annual_revenue: Tổng doanh thu lũy kế cả năm (VND)

    Returns:
        dict với đầy đủ thông tin thuế Nhóm 1
    """
    threshold = REVENUE_THRESHOLD           # 500,000,000
    gtgt_rate = 1.0                         # 1% GTGT — Nhóm 1
    tncn_rate = 0.5                         # 0.5% TNCN — Nhóm 1
    total_rate = gtgt_rate + tncn_rate      # 1.5%

    exempt_amount = min(annual_revenue, threshold)
    taxable       = max(0.0, annual_revenue - threshold)
    gtgt_due      = taxable * (gtgt_rate / 100)
    tncn_due      = taxable * (tncn_rate / 100)
    total_due     = gtgt_due + tncn_due
    is_exempt     = annual_revenue <= threshold

    return {
        "annual_revenue":  annual_revenue,
        "threshold":       threshold,
        "exempt_amount":   exempt_amount,
        "taxable":         taxable,
        "gtgt_rate":       gtgt_rate,
        "tncn_rate":       tncn_rate,
        "total_rate":      total_rate,
        "gtgt_due":        gtgt_due,
        "tncn_due":        tncn_due,
        "total_due":       total_due,
        "is_exempt":       is_exempt,
        "group_label":     "Nhóm 1 — Phân phối, bán lẻ hàng hóa (1% GTGT + 0.5% TNCN)",
        "law_ref":         "Luật 109/2025/QH15 + TT 40/2021/TT-BTC | Hiệu lực 01/01/2026",
        "note": (
            "✅ MIỄN THUẾ (doanh thu ≤ 500 triệu/năm)"
            if is_exempt else
            f"⚠️ Phần vượt {threshold/1_000_000:.0f}tr: {taxable:,.0f}đ → "
            f"GTGT {gtgt_rate}%={gtgt_due:,.0f}đ + TNCN {tncn_rate}%={tncn_due:,.0f}đ = {total_due:,.0f}đ"
        ),
    }



if __name__ == "__main__":
    # Demo test
    test_cases = [
        (400_000_000, "1_phan_phoi", 0),
        (800_000_000, "3_sanxuat_3_15", 500_000_000),
        (1_500_000_000, "2_dichvu_5_2", 0),
        (2_000_000_000, "2_kchiu_gtgt", 0)
    ]
    for rev, ind, cost in test_cases:
        r = calculate_hkd_tax(rev, ind, cost)
        print(f"\n[{INDUSTRY_NAMES[ind]}]")
        print(f"  Doanh thu: {rev:>18,.0f}đ")
        print(f"  GTGT ({r['gtgt_rate']}%): {r['gtgt_due']:>18,.0f}đ")
        print(f"  TNCN ({r['tncn_rate']}%): {r['tncn_due']:>18,.0f}đ")
        print(f"  Tổng nộp: {r['total_due']:>18,.0f}đ   {'✅ MIỄN' if r['is_exempt'] else '⚠️ CÓ THUẾ'}")
