from __future__ import annotations

"""Metadata classification, cash register identification, and cost categorizers."""


from decimal import Decimal
from typing import Any


class InvoiceMetadataMixin:
    """Mixin providing classification and categorization methods for invoices."""

    @staticmethod
    def is_cash_register_invoice(series: str | None, template: str | None = "") -> bool:
        """Nhận diện hóa đơn điện tử khởi tạo từ máy tính tiền (MTT) theo Nghị định 123 & Thông tư 78."""
        s = (series or "").strip().upper()
        return (
            s.startswith("K")
            or s.startswith("M")
            or s.startswith("1K")
            or s.startswith("2K")
            or s.startswith("1M")
            or s.startswith("2M")
            or s.startswith("6K")
            or s.startswith("6M")
        )

    @staticmethod
    def get_invoice_type_metadata(
        series: str | None,
        template_code: str | None = "1",
        seller_name: str | None = "",
    ) -> dict[str, Any]:
        """Trả về nhãn, phân loại và cơ sở pháp lý cho từng loại hóa đơn."""
        is_mtt = InvoiceMetadataMixin.is_cash_register_invoice(series, template_code)
        s_name_lower = (seller_name or "").lower()
        is_petrol = any(
            k in s_name_lower
            for k in [
                "xăng dầu",
                "petrolimex",
                "pvoil",
                "nhiên liệu",
                "dầu khí",
                "bình minh an",
                "nam ninh",
            ]
        )

        if is_mtt:
            if is_petrol:
                label = "HÓA ĐƠN XĂNG DẦU (MTT NĐ123)"
                badge = "⛽ HÓA ĐƠN XĂNG DẦU (MTT)"
                badge_short = "⛽ XĂNG DẦU MTT"
                category = "cash_register_petrol"
            elif str(template_code) == "2":
                label = "HÓA ĐƠN BÁN HÀNG TỪ MÁY TÍNH TIỀN"
                badge = "🏪 HÓA ĐƠN BÁN HÀNG (MTT)"
                badge_short = "🏪 BÁN HÀNG MTT"
                category = "cash_register_sales"
            else:
                label = "HÓA ĐƠN GTGT KHỞI TẠO TỪ MÁY TÍNH TIỀN"
                badge = "🏪 HÓA ĐƠN MÁY TÍNH TIỀN (MTT)"
                badge_short = "🏪 HĐĐT MTT"
                category = "cash_register_vat"
        else:
            if str(template_code) == "2":
                label = "HÓA ĐƠN BÁN HÀNG"
                badge = "🧾 HÓA ĐƠN BÁN HÀNG"
                badge_short = "🧾 BÁN HÀNG"
                category = "standard_sales"
            else:
                label = "HÓA ĐƠN GIÁ TRỊ GIA TĂNG"
                badge = "📋 HÓA ĐƠN GTGT CHUẨN"
                badge_short = "📋 HĐ GTGT"
                category = "standard_vat"

        return {
            "is_cash_register": is_mtt,
            "type_label": label,
            "badge_label": badge,
            "badge_short": badge_short,
            "type_category": category,
            "legal_basis": "Khoản 3 Điều 11 Nghị định 123/2020/NĐ-CP & Điều 8 Thông tư 78/2021/TT-BTC"
            if is_mtt
            else "Nghị định 123/2020/NĐ-CP & Thông tư 78/2021/TT-BTC",
        }

    def categorize_item_cost(self, item_name: str, item_code: str = "") -> str:
        """Phân loại nhóm chi phí xây dựng từ tên và mã hàng hóa."""
        combined = f"{(item_name or '').lower()} {(item_code or '').lower()}".strip()

        # 1. Thầu phụ & Gói thầu chuyên môn (Subcontractors & Specialized Work)
        subcontractor_keywords = [
            "ép cọc",
            "ep coc",
            "khoan cọc",
            "khoan coc",
            "cọc ly tâm",
            "trần thạch cao",
            "cơ điện",
            "m&e",
            "pccc",
            "phòng cháy",
            "nhôm kính",
            "vách kính",
            "chống thấm",
            "son ba",
            "sơn bả",
            "thí nghiệm",
            "quan trắc",
            "thầu phụ",
            "giao khoán",
            "gia công",
            "lắp dựng kết cấu",
            "thi công cống",
            "trải thảm asphalt",
            "hệ thống chiếu sáng",
            "hạ tầng",
        ]
        if any(k in combined for k in subcontractor_keywords):
            return "subcontractor"

        # 2. Ca máy & Nhân công (Machinery & Labor)
        machinery_keywords = [
            "máy đào",
            "may dao",
            "ca máy",
            "ca may",
            "cẩu",
            "cau thap",
            "xe cẩu",
            "lu rung",
            "máy lu",
            "xe tải",
            "xe ben",
            "vận chuyển",
            "bơm bê tông",
            "bom be tong",
            "nhân công",
            "nhan cong",
            "tổ thợ",
            "to tho",
            "cốt thép",
            "cốp pha",
            "cop pha",
            "ván khuôn",
            "cơ giới",
            "máy ủi",
            "máy san",
            "xe bồn",
            "ép cừ",
            "nhổ cừ",
            "nhân lực",
            "tiền công",
        ]
        if any(k in combined for k in machinery_keywords):
            return "machinery_labor"

        # 3. Vật liệu chính (Main Materials)
        main_materials_keywords = [
            "thép",
            "thep",
            "sắt",
            "sat",
            "rebar",
            "cb400",
            "cb300",
            "cb500",
            "d10",
            "d12",
            "d14",
            "d16",
            "d18",
            "d20",
            "d22",
            "d25",
            "d28",
            "d32",
            "xi măng",
            "ximang",
            "cement",
            "pcb30",
            "pcb40",
            "pcb50",
            "vicem",
            "hoàng thạch",
            "chinfon",
            "bê tông",
            "betong",
            "concrete",
            "c20",
            "c25",
            "c30",
            "c35",
            "c40",
            "m100",
            "m150",
            "m200",
            "m250",
            "m300",
            "m350",
            "m400",
            "cát ",
            "cát xây",
            "cát bê tông",
            "cat vang",
            "cat den",
            "cát san lấp",
            "đá 1x2",
            "đá 4x6",
            "đá dăm",
            "đá mi",
            "da 1x2",
            "da 4x6",
            "da dam",
            "gạch",
            "gach",
            "gạch tuynel",
            "gạch không nung",
            "gạch block",
            "vữa",
            "vua ",
            "tôn mạ",
            "tôn lạnh",
            "xà gồ",
            "ống thép",
            "thép hình",
            "thép tấm",
            "thép hộp",
            "thép i",
            "thép v",
        ]
        if any(k in combined for k in main_materials_keywords):
            return "material_main"

        # 4. Chi phí quản lý chung & Lán trại (General Overhead & Fuel)
        general_keywords = [
            "lán trại",
            "lan trai",
            "nhiên liệu",
            "dầu do",
            "dầu diesel",
            "xăng",
            "bảo hiểm",
            "điện nước",
            "văn phòng phẩm",
            "bảo hộ lao động",
            "mũ bảo hộ",
            "giày bảo hộ",
            "bạt che",
            "vật tư phụ",
            "dây kẽm",
            "đinh",
            "que hàn",
            "khí oxy",
            "khí gas",
        ]
        if any(k in combined for k in general_keywords):
            return "general_expense"

        return "other"

    def generate_detailed_fallback_items(
        self,
        seller_name: str,
        buyer_name: str,
        direction: str,
        subtotal: Decimal,
        vat_rate: Decimal,
        invoice_series: str = "1C26TDS",
        invoice_number: str = "00000001",
    ) -> list[dict[str, Any]]:
        """Không tự sinh dữ liệu giả định. Trả về danh sách rỗng để bảo toàn tính xác thực tuyệt đối theo nguồn dữ liệu gốc của Tổng Cục Thuế."""
        return []

    def infer_invoice_category(
        self, seller_name: str, notes: str = "", item_name: str = ""
    ) -> dict[str, str]:
        """Xác định phân loại hàng hóa / tài sản của hóa đơn."""
        combined = f"{seller_name or ''} {notes or ''} {item_name or ''}".lower()
        if any(
            k in combined
            for k in [
                "máy đào",
                "máy xúc",
                "volvo",
                "komatsu",
                "pc200",
                "ew140",
                "hitachi",
                "doosan",
                "dx140",
                "zx200",
            ]
        ):
            return {
                "key": "excavator",
                "label": "Máy Đào & Cơ Giới",
                "icon": "🚜",
                "badge_class": "badge-orange",
            }
        if any(
            k in combined
            for k in [
                "xe tải",
                "xe ben",
                "thaco",
                "howo",
                "forland",
                "auman",
                "isuzu",
                "hyundai hd",
                "ô tô tải",
                "oto tải",
                "xe tự đổ",
            ]
        ):
            return {
                "key": "truck",
                "label": "Xe Tải & Ô Tô",
                "icon": "🚗",
                "badge_class": "badge-blue",
            }
        if any(
            k in combined
            for k in ["máy cắt bê tông", "máy cắt đường", "kc16", "kc20", "cắt bê tông"]
        ):
            return {
                "key": "concrete_cutter",
                "label": "Máy Cắt Bê Tông",
                "icon": "✂️",
                "badge_class": "badge-cyan",
            }
        if any(
            k in combined
            for k in [
                "máy hàn",
                "máy cắt plasma",
                "jasic",
                "riland",
                "hàn điện tử",
                "hàn tig",
                "hàn mig",
            ]
        ):
            return {
                "key": "welder",
                "label": "Máy Hàn & Cơ Khí",
                "icon": "⚡",
                "badge_class": "badge-purple",
            }
        if any(
            k in combined
            for k in [
                "máy khoan",
                "khoan rút lõi",
                "makita",
                "bosch",
                "máy đục",
                "máy đục bê tông",
            ]
        ):
            return {
                "key": "drill",
                "label": "Máy Khoan & Đục",
                "icon": "🔩",
                "badge_class": "badge-indigo",
            }
        if any(
            k in combined
            for k in [
                "máy đầm",
                "đầm cóc",
                "mikasa",
                "đầm bàn",
                "conmec",
                "đầm dùi",
                "jinlong",
            ]
        ):
            return {
                "key": "compactor",
                "label": "Máy Đầm Nền",
                "icon": "🔨",
                "badge_class": "badge-yellow",
            }
        if any(k in combined for k in ["máy nén khí", "puma"]):
            return {
                "key": "compressor",
                "label": "Máy Nén Khí",
                "icon": "💨",
                "badge_class": "badge-teal",
            }
        if any(k in combined for k in ["máy phát điện", "denyo", "genset", "cummins"]):
            return {
                "key": "generator",
                "label": "Máy Phát Điện",
                "icon": "🔋",
                "badge_class": "badge-emerald",
            }
        if any(
            k in combined
            for k in [
                "máy công trình",
                "thiết bị điện hải phòng",
                "veltech",
                "emc việt nam",
                "đức anh",
            ]
        ):
            return {
                "key": "machinery",
                "label": "Máy Móc / Thiết Bị",
                "icon": "⚙️",
                "badge_class": "badge-orange",
            }
        if any(
            k in combined
            for k in [
                "petrolimex",
                "pvoil",
                "xăng dầu",
                "diesel",
                "do 0.05",
                "hfc",
                "hoàng phúc",
            ]
        ):
            return {
                "key": "fuel",
                "label": "Xăng Dầu / Nhiên Liệu",
                "icon": "⛽",
                "badge_class": "badge-amber",
            }
        if any(
            k in combined
            for k in [
                "thép",
                "xi măng",
                "chinfon",
                "hòa phát",
                "cát",
                "đá",
                "gạch",
                "bê tông",
                "bích vân",
                "lâm cường",
                "đại vũ",
                "ngọc thuỷ",
                "tâm chiến",
            ]
        ):
            return {
                "key": "materials",
                "label": "Vật Liệu Xây Dựng",
                "icon": "🧱",
                "badge_class": "badge-gray",
            }
        if any(
            k in combined
            for k in [
                "vận tải",
                "bốc xúc",
                "thuê ca",
                "thi công",
                "tư vấn",
                "thí nghiệm",
            ]
        ):
            return {
                "key": "services",
                "label": "Dịch Vụ & Thuê Ca",
                "icon": "🛠",
                "badge_class": "badge-slate",
            }
        return {
            "key": "general",
            "label": "Hàng Hóa / Dịch Vụ",
            "icon": "📄",
            "badge_class": "badge-default",
        }
