"""
s1a_module.py — Giao diện Sổ Chi tiết Doanh Thu S1a-HKD (Dành cho Nhóm 1)
Theo Thông tư 152/2025/TT-BTC
"""
import os
import sys
from datetime import datetime, date

from PySide6.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QFrame,
    QTableWidget, QTableWidgetItem, QHeaderView,
    QDateEdit, QLabel, QTabWidget, QFileDialog, QMessageBox,
    QScrollArea
)
from PySide6.QtCore import Qt, QDate
from PySide6.QtGui import QFont, QColor

# make sure src/ is on path
_SRC = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
if _SRC not in sys.path:
    sys.path.insert(0, _SRC)

from gui.theme import COLORS
from gui.ui_helpers import (
    SP, PrimaryButton, GhostButton, FilterBar, PageHeader, CardFrame,
    apply_table_style, right_align_cell, make_combo
)
from core.revenue_db import get_entries_by_month, CATEGORIES
from core.hkd_tax import calculate_nhom1_annual, REVENUE_THRESHOLD


LEGACY_CATEGORY_LABELS = {
    "ban_hang": "Bán hàng",
    "dich_vu": "Dịch vụ",
    "khac": "Khác",
}

def _fmt_vnd(amount: float) -> str:
    if not amount:
        return ""
    return f"{amount:,.0f}"

class S1aModule(QWidget):
    """Sổ Chi tiết Doanh thu S1a-HKD"""

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName("s1a_module")
        self._db_path = ""
        self.setup_ui()
        # Chờ có db_path trong lệnh refresh mới load_data


    def setup_ui(self):
        main_layout = QVBoxLayout(self)
        main_layout.setContentsMargins(0, 0, 0, 0)
        main_layout.setSpacing(SP["M"])

        # Tab widget
        self._tabs = QTabWidget()
        self._tabs.setObjectName("s1a_tabs")

        # Tab 1: Mẫu số S1a-HKD
        tab_s1a = QWidget()
        tab_layout = QVBoxLayout(tab_s1a)
        tab_layout.setContentsMargins(12, 12, 12, 12)
        tab_layout.setSpacing(SP["M"])

        # Main Content Card
        card = CardFrame()
        card_layout = QVBoxLayout(card)
        card_layout.setContentsMargins(SP["L"], SP["L"], SP["L"], SP["L"])
        card_layout.setSpacing(SP["M"])

        # Filter Bar
        years = [str(y) for y in range(2026, 2031)]
        self.year_filter = make_combo(years)
        self.year_filter.setCurrentText(str(datetime.now().year))
        self.year_filter.setFixedWidth(120)
        self.year_filter.currentIndexChanged.connect(self.load_data)

        btn_export = GhostButton("Xuất Excel", "📥")
        btn_export.clicked.connect(self._export_excel)
        btn_print = PrimaryButton("In Sổ S1a", "🖨️")

        lbl_filter = QLabel("Năm báo cáo:")
        lbl_filter.setFont(QFont("Segoe UI", 10))

        filter_bar = FilterBar(lbl_filter, self.year_filter, btn_export, btn_print)
        card_layout.addWidget(filter_bar)

        # Table S1a
        self.table = QTableWidget(0, 4)
        self.table.setHorizontalHeaderLabels([
            "Ngày",
            "Giao dịch",
            "Tổng Doanh Thu",
            "Ghi chú"
        ])

        apply_table_style(self.table, stretch_col=1, fixed_cols={
            0: 100, 2: 150, 3: 200
        })
        card_layout.addWidget(self.table)

        # ── Panel tóm tắt thuế Nhóm 1 ──────────────────────────────────
        self._tax_card = CardFrame()
        self._tax_card.setMaximumHeight(160)
        tax_layout = QHBoxLayout(self._tax_card)
        tax_layout.setContentsMargins(20, 12, 20, 12)
        tax_layout.setSpacing(24)

        def _stat(icon, label, value_id, color="#1e293b"):
            col = QVBoxLayout()
            col.setSpacing(2)
            lbl_top = QLabel(f"{icon}  {label}")
            lbl_top.setFont(QFont("Segoe UI", 8))
            lbl_top.setStyleSheet("color:#64748b; background: transparent; border: none;")
            val_lbl = QLabel("—")
            val_lbl.setFont(QFont("Segoe UI", 13, QFont.Weight.Bold))
            val_lbl.setStyleSheet(f"color:{color}; background: transparent; border: none;")
            val_lbl.setObjectName(value_id)
            col.addWidget(lbl_top)
            col.addWidget(val_lbl)
            setattr(self, value_id, val_lbl)
            return col

        tax_layout.addLayout(_stat("📈", "Doanh thu năm",      "_lbl_year_rev",  "#0ea5e9"))
        tax_layout.addLayout(_stat("🏷️", "Phần được miễn",    "_lbl_exempt",    "#16a34a"))
        tax_layout.addLayout(_stat("⚠️", "Phần chịu thuế",    "_lbl_taxable",   "#dc2626"))
        tax_layout.addLayout(_stat("🏦", "GTGT (1%)",           "_lbl_gtgt",      "#7c3aed"))
        tax_layout.addLayout(_stat("👤", "TNCN (0.5%)",         "_lbl_tncn",      "#7c3aed"))
        tax_layout.addLayout(_stat("💰", "Tổng thuế phải nộp", "_lbl_total_tax", "#dc2626"))

        self._lbl_tax_status = QLabel("✅ MIỄN THUẾ")
        self._lbl_tax_status.setFont(QFont("Segoe UI", 10, QFont.Weight.Bold))
        self._lbl_tax_status.setStyleSheet(
            "background:#dcfce7; color:#166534; border-radius:6px; padding:4px 12px;"
        )
        self._lbl_tax_status.setAlignment(Qt.AlignmentFlag.AlignCenter)
        tax_layout.addWidget(self._lbl_tax_status)

        tab_layout.addWidget(card)
        tab_layout.addWidget(self._tax_card)
        self._tabs.addTab(tab_s1a, "📄  Mẫu số S1a-HKD")

        # Tab 2: Hướng dẫn
        self.guide_tab = self._build_guide_tab()
        self._tabs.addTab(self.guide_tab, "📖  HƯỚNG DẪN")

        main_layout.addWidget(self._tabs)


    def load_data(self):
        """Load data from revenue.db, pivot into S1a columns, tính thuế lũy kế năm."""
        self.table.setRowCount(0)

        year_str = self.year_filter.currentText()
        if not year_str:
            return
        year = int(year_str)

        # -- Lấy dữ liệu cả năm
        entries = []
        db = getattr(self, '_db_path', '')
        for m in range(1, 13):
            entries.extend(get_entries_by_month(year, m, db_path=db))

        # Sắp xếp theo ngày
        def get_dt(e):
            if isinstance(e, dict):
                return e.get("entry_date") or e.get("date") or ""
            else:
                return e[1]
        entries.sort(key=get_dt)

        # Calculate totals
        totals = {
            "total": 0.0,
            "phan_phoi": 0.0,
            "dich_vu": 0.0,
            "san_xuat": 0.0,
            "khac": 0.0
        }

        # Map core DB keys to strict local categories logic
        cat_map = {
            "thu_ban_hang": "phan_phoi",
            "thu_ban_hang_ck": "phan_phoi",
            "thu_no_cong":  "phan_phoi", # Nhóm 1 - Nợ công vẫn tính doanh thu
            "thu_tra_hang_tm": "phan_phoi", # Trả hàng sẽ trừ vào nhóm này
            "thu_tra_hang_ck": "phan_phoi", # Trả hàng sẽ trừ vào nhóm này
            "dich_vu": "dich_vu",
            "san_xuat": "san_xuat",
            "khac": "khac"
        }

        doc_row = 0
        for e in entries:
            # entry có thể là tuple hoặc dict — dùng get() an toàn
            if isinstance(e, dict):
                dt_str  = e.get("entry_date") or e.get("date") or ""
                amt     = float(e.get("amount") or 0)
                cat_raw = e.get("category") or ""
                note    = e.get("note") or "Doanh thu bán hàng"
                partner_name = (e.get("partner_name") or "").strip()
                invoice_code = (e.get("invoice_code") or "").strip()
                # Removed: appending partner name to note
            else:
                # fallback tuple: (id, date, amount, category, note, p_code, qty)
                dt_str  = e[1]
                amt     = float(e[2] or 0)
                cat_raw = e[3] or ""
                note    = e[4] or "Doanh thu bán hàng"
                partner_name = ""
                invoice_code = ""

            # Parse date for display
            try:
                dt_obj = datetime.strptime(dt_str, "%Y-%m-%d")
                d_display = dt_obj.strftime("%d/%m/%Y")
            except:
                d_display = dt_str

            col_key = cat_map.get(cat_raw, "khac")
            
            # Xử lý số tiền thực tế (Trả hàng = Số âm)
            is_return = str(cat_raw).startswith("thu_tra_hang")
            real_amt = -amt if is_return else amt

            totals["total"] += real_amt
            totals[col_key] += real_amt

            self.table.insertRow(doc_row)
            
            # Giao dịch là loại danh mục (Bán hàng, Trả hàng, ...)
            cat_label = CATEGORIES.get(cat_raw, LEGACY_CATEGORY_LABELS.get(cat_raw, "Khác"))
            cat_text = cat_label
            if cat_label and " " in cat_label and not cat_label[0].isalnum():
                cat_text = cat_label.split(" ", 1)[1]
            giao_dich = cat_text
            if partner_name:
                giao_dich += f" khách hàng {partner_name}"
            if invoice_code:
                giao_dich += f" - {invoice_code}"
            
            # Render row items
            item_dateStr = QTableWidgetItem(d_display)
            item_giao_dich = QTableWidgetItem(giao_dich)
            item_amt     = QTableWidgetItem(_fmt_vnd(real_amt))
            item_note    = QTableWidgetItem(note)
            
            if is_return:
                red = QColor("#dc2626") # Màu đỏ cho hàng trả lại
                item_amt.setForeground(red)
                item_giao_dich.setForeground(red)
                item_dateStr.setForeground(red)
                item_note.setForeground(red)

            self.table.setItem(doc_row, 0, item_dateStr)
            self.table.setItem(doc_row, 1, item_giao_dich)
            self.table.setItem(doc_row, 2, item_amt)
            right_align_cell(self.table, doc_row, 2)

            self.table.setItem(doc_row, 3, item_note)
            doc_row += 1

        # Add total row
        self.table.insertRow(doc_row)
        total_item = QTableWidgetItem("TỔNG CỘNG:")
        total_item.setFont(QFont("Segoe UI", 10, QFont.Weight.Bold))
        self.table.setItem(doc_row, 1, total_item)
        
        item = QTableWidgetItem(_fmt_vnd(totals["total"]))
        item.setFont(QFont("Segoe UI", 10, QFont.Weight.Bold))
        item.setForeground(QColor(COLORS["accent"]))
        self.table.setItem(doc_row, 2, item)
        right_align_cell(self.table, doc_row, 2)

        # Cập nhật panel thuế với doanh thu năm
        self._update_tax_panel(annual_total=totals["total"])

    def _update_tax_panel(self, annual_total: float):
        """Cập nhật panel tóm tắt thuế Nhóm 1 — chỉ tính phần vượt 500 triệu/năm."""
        tax = calculate_nhom1_annual(annual_total)

        fmt = lambda v: f"{v:,.0f} đ"

        self._lbl_year_rev.setText(fmt(annual_total))
        self._lbl_exempt.setText(fmt(tax["exempt_amount"]))
        self._lbl_taxable.setText(fmt(tax["taxable"]))
        self._lbl_gtgt.setText(fmt(tax["gtgt_due"]))
        self._lbl_tncn.setText(fmt(tax["tncn_due"]))
        self._lbl_total_tax.setText(fmt(tax["total_due"]))

        threshold = REVENUE_THRESHOLD
        if tax["is_exempt"]:
            self._lbl_tax_status.setText("✅  MIỄN THUẾ")
            self._lbl_tax_status.setStyleSheet(
                "background:#dcfce7; color:#166534; border-radius:6px; padding:4px 12px;"
            )
        else:
            pct = (annual_total / threshold - 1) * 100
            self._lbl_tax_status.setText(f"⚠️  VƯỢT NGƯỠNG +{pct:.1f}%")
            self._lbl_tax_status.setStyleSheet(
                "background:#fef2f2; color:#991b1b; border-radius:6px; padding:4px 12px;"
            )

    def refresh(self, db_path: str = ""):
        if db_path:
            self._db_path = db_path
        self.load_data()


    def _export_excel(self):
        """Xuất Mẫu số S1a-HKD ra file Excel chuẩn theo format mẫu của Chi cục Thuế."""
        try:
            import openpyxl
            from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
            from openpyxl.utils import get_column_letter
        except ImportError:
            QMessageBox.critical(self, "❌ Thiếu thư viện",
                "Vui lòng cài openpyxl:\n.venv\\Scripts\\pip install openpyxl")
            return

        year_str = self.year_filter.currentText()
        if not year_str:
            return
        year = int(year_str)
        
        default_name = f"Mau-So-S1a-HKD_{year}.xlsx"
        path, _ = QFileDialog.getSaveFileName(
            self, "Lưu file Excel", default_name, "Excel Files (*.xlsx)"
        )
        if not path:
            return

        # ── Style helpers ─────────────────────────────────────────
        def thin_border():
            s = Side(style="thin")
            return Border(left=s, right=s, top=s, bottom=s)

        bold_font = Font(bold=True, name="Times New Roman", size=11)
        body_font = Font(name="Times New Roman", size=11)
        num_fmt   = "#,##0"
        center    = Alignment(horizontal="center", vertical="center", wrap_text=True)
        right_al  = Alignment(horizontal="right",  vertical="center")
        left_al   = Alignment(horizontal="left",   vertical="center")

        wb = openpyxl.Workbook()
        ws = wb.active
        ws.title = "S1a-HKD"

        # ── Tiêu đề Header của file mẫu ──────────────────────────────────────────────
        # Thông tin Cơ sở
        main = self.window()
        company_info = getattr(main, "company_info", {}) or {}
        company_name = (
            company_info.get("legal_name")
            or company_info.get("name")
            or "HỘ KINH DOANH ...................."
        )
        company_addr = company_info.get("address") or "......................................................................."
        company_tax = company_info.get("tax_id") or "...................."

        ws["A1"] = str(company_name).upper()
        ws["A1"].font = bold_font
        ws["C1"] = "Mẫu số S1-HKD"
        ws["C1"].font = bold_font
        ws["C1"].alignment = Alignment(horizontal="right")
        
        ws["A2"] = str(company_addr)
        ws["A2"].font = body_font
        ws["C2"] = "(Kèm theo thông tư số 15/2025/TT-BTC\nngày 31 tháng 12 năm 2025 của Bộ Tài Chính)"
        ws["C2"].font = body_font
        ws["C2"].alignment = Alignment(horizontal="right", wrap_text=True)
        ws.row_dimensions[2].height = 30 # For the wrapped text
        
        ws["A3"] = f"Mã số thuế: {company_tax}"
        ws["A3"].font = body_font
        
        # Title
        ws.merge_cells("A5:C5")
        ws["A5"] = "SỔ CHI TIẾT DOANH THU BÁN HÀNG HÓA, DỊCH VỤ"
        ws["A5"].font = Font(bold=True, size=14, name="Times New Roman")
        ws["A5"].alignment = center
        
        ws.merge_cells("A6:C6")
        ws["A6"] = f"Địa điểm kinh doanh: {company_addr}"
        ws["A6"].font = Font(name="Times New Roman", size=11)
        ws["A6"].alignment = center
        
        ws["A7"] = f"Năm {year}"
        ws["A7"].font = body_font
        
        ws["C8"] = "Đơn vị tính: Đồng Việt Nam"
        ws["C8"].font = body_font
        ws["C8"].alignment = Alignment(horizontal="right")

        # ── Header bảng (row 9) ── 3 columns
        HEADERS = ["Ngày tháng", "Giao dịch", "Tổng Doanh Thu"]
        for c, h in enumerate(HEADERS, 1):
            cell = ws.cell(row=9, column=c, value=h)
            cell.font = bold_font
            cell.alignment = center
            cell.border = thin_border()
        
        # ── Dữ liệu từ table (lấy từ cột 0, 1, 2, 3) ─────────────────────────────────────
        row_idx = 10
        total_revenue = 0.0
        
        total_rows = self.table.rowCount()
        for r in range(total_rows - 1):  # bỏ dòng TỔNG CỘNG cuối của table UI
            # Parse Date to exactly YYYY-MM-DD HH:MM:SS or just match original data string
            raw_date = self.table.item(r, 0).text() if self.table.item(r, 0) else ""
            try:
                dt_obj = datetime.strptime(raw_date, "%d/%m/%Y")
                d_val = dt_obj.strftime("%Y-%m-%d 00:00:00")
            except:
                d_val = raw_date
                
            cat_val = self.table.item(r, 1).text() if self.table.item(r, 1) else ""
            
            amt_str = self.table.item(r, 2).text() if self.table.item(r, 2) else ""
            num_val = float(amt_str.replace(",", "").replace(" đ", "").replace("đ", "")) if amt_str.strip() else 0.0
            
            total_revenue += num_val
            
            # Cột A: Ngày
            c1 = ws.cell(row=row_idx, column=1, value=d_val)
            c1.border = thin_border(); c1.alignment = left_al; c1.font = body_font
            
            # Cột B: Giao dịch
            c2 = ws.cell(row=row_idx, column=2, value=cat_val)
            c2.border = thin_border(); c2.alignment = left_al; c2.font = body_font
            
            # Cột C: Số tiền
            c3 = ws.cell(row=row_idx, column=3, value=num_val)
            c3.border = thin_border(); c3.alignment = right_al; c3.font = body_font; c3.number_format = num_fmt
            
            row_idx += 1

        # ── Dòng TỔNG CỘNG ───────────────────────────────────────
        ws.merge_cells(f"A{row_idx}:B{row_idx}")
        lbl = ws.cell(row=row_idx, column=1, value="Tổng cộng")
        lbl.font = bold_font
        lbl.alignment = center; lbl.border = thin_border()
        ws.cell(row=row_idx, column=2).border = thin_border()
        
        c3_tot = ws.cell(row=row_idx, column=3, value=total_revenue)
        c3_tot.font = bold_font; c3_tot.alignment = right_al; c3_tot.border = thin_border()
        c3_tot.number_format = num_fmt

        # ── Khối chữ ký cuối sổ ──────────────────────────────────
        rep_name = company_info.get("representative") or "{Người đại diện hộ}"
        rep_pos = company_info.get("position") or "{giám đốc}"

        sign_row = row_idx + 3
        ws.merge_cells(f"B{sign_row}:C{sign_row}")
        ws.cell(row=sign_row, column=2, value="Ngày.......tháng......năm........")
        ws.cell(row=sign_row, column=2).font = body_font
        ws.cell(row=sign_row, column=2).alignment = Alignment(horizontal="center", vertical="center")

        ws.merge_cells(f"B{sign_row + 1}:C{sign_row + 1}")
        ws.cell(row=sign_row + 1, column=2, value=rep_name)
        ws.cell(row=sign_row + 1, column=2).font = bold_font
        ws.cell(row=sign_row + 1, column=2).alignment = Alignment(horizontal="center", vertical="center")

        ws.merge_cells(f"B{sign_row + 2}:C{sign_row + 2}")
        ws.cell(row=sign_row + 2, column=2, value="(Ký, họ tên, đóng dấu (nếu có))")
        ws.cell(row=sign_row + 2, column=2).font = body_font
        ws.cell(row=sign_row + 2, column=2).alignment = Alignment(horizontal="center", vertical="center")

        ws.merge_cells(f"B{sign_row + 5}:C{sign_row + 5}")
        ws.cell(row=sign_row + 5, column=2, value=rep_pos)
        ws.cell(row=sign_row + 5, column=2).font = bold_font
        ws.cell(row=sign_row + 5, column=2).alignment = Alignment(horizontal="center", vertical="center")

        # ── Độ rộng cột ──────────────────────────────────────────
        ws.column_dimensions['A'].width = 25
        ws.column_dimensions['B'].width = 55
        ws.column_dimensions['C'].width = 20

        # ── Định dạng trang in ───────────────────────────────────
        ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT
        ws.page_setup.paperSize   = ws.PAPERSIZE_A4
        ws.print_title_rows = "9:9"

        try:
            wb.save(path)
            QMessageBox.information(
                self, "✅ Xuất thành công",
                f"Mẫu S1a-HKD đã được xuất ra:\n{path}"
            )
            os.startfile(path)
        except Exception as ex:
            QMessageBox.critical(self, "❌ Lỗi", f"Không thể lưu file:\n{ex}")

    def _build_guide_tab(self) -> QWidget:
        """Tab cẩm nang hướng dẫn kê khai thuế 2026."""
        w = QWidget()
        layout = QVBoxLayout(w)
        layout.setContentsMargins(0, 0, 0, 0)

        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        scroll.setFrameShape(QFrame.Shape.NoFrame)

        content = QWidget()
        c_layout = QVBoxLayout(content)
        c_layout.setContentsMargins(30, 25, 30, 25)
        c_layout.setSpacing(15)

        guide_text = """
        <h2 style='color: #2c3e50;'>📖 Cẩm nang Thuế Hộ Kinh Doanh 2026</h2>
        <p style='color:#555;'>Căn cứ: <b>Thông tư 40/2021/TT-BTC (Phụ lục I)</b> + <b>Luật 109/2025/QH15</b></p>

        <div style='background-color:#eaf4ff;padding:12px;border-radius:8px;border-left:5px solid #007bff;margin-bottom:10px;'>
            <b>🎯 Ngưỡng miễn thuế 2026</b><br>
            ✅ &lt;500 triệu/năm: <b>MIỄN</b> toàn bộ GTGT &amp; TNCN — chỉ cần thông báo doanh thu trước 31/01.<br>
            ⚠️ 500tr–3 tỷ/năm: Kê khai theo tỷ lệ % hoặc lợi nhuận thực.<br>
            🔴 &gt;1 tỷ/năm: Bắt buộc dùng <b>Hóa đơn điện tử</b>.
        </div>

        <h3 style='color:#2c3e50;'>📊 Biểu thuế suất theo Ngành nghề</h3>
        <ul style='color:#555;'>
            <li><b>1.5%</b> (Bán buôn, bán lẻ hàng hóa) — <i>GTGT 1% + TNCN 0.5%</i></li>
            <li><b>3%</b> (Sản xuất, gia công, kinh doanh khác) — <i>GTGT 2% + TNCN 1%</i></li>
            <li><b>4.5%</b> (Dịch vụ ăn uống, vận tải, có bao thầu vật tư) — <i>GTGT 3% + TNCN 1.5%</i></li>
            <li><b>7%</b> (Dịch vụ thuần túy, lưu trú, không bao thầu vật tư) — <i>GTGT 5% + TNCN 2%</i></li>
            <li><b>10%</b> (Cho thuê tài sản) — <i>GTGT 5% + TNCN 5%</i></li>
        </ul>

        <h3 style='color:#2c3e50;'>📋 Quy trình Kê khai (3 bước)</h3>
        <div style='background:#fff;border:1px solid #ddd;padding:10px;border-radius:8px;margin-bottom:5px;'>
            <b>Bước 1:</b> Đăng ký tài khoản — tải app <b>eTax Mobile</b> hoặc vào <i>canhan.gdt.gov.vn</i>
        </div>
        <div style='background:#fff;border:1px solid #ddd;padding:10px;border-radius:8px;margin-bottom:5px;'>
            <b>Bước 2:</b> Nộp <b>Tờ khai 01/CNKD</b> — nhập doanh thu, chọn đúng ngành nghề, hệ thống tự tính thuế.
        </div>
        <div style='background:#fff;border:1px solid #ddd;padding:10px;border-radius:8px;margin-bottom:10px;'>
            <b>Bước 3:</b> Nộp thuế điện tử qua tài khoản ngân hàng liên kết — không cần ra kho bạc.
        </div>

        <div style='background:#fff4e5;padding:12px;border-radius:8px;border-left:5px solid #e67e22;margin-bottom:8px;'>
            <b>⚠️ Bảng Mức Phạt Vi Phạm (NĐ 125/2020 + NĐ 310/2025, hiệu lực từ 16/01/2026):</b><br>
            <small style='color:#666;'>Áp dụng cho HKD = mức cá nhân. Hộ bị khoán thuế không bị phạt khai sai.</small>

            <table style='width:100%;border-collapse:collapse;margin-top:8px;font-size:11px;'>
                <tr style='background:#e67e22;color:white;'>
                    <th style='padding:4px 6px;text-align:left;'>Vi phạm</th>
                    <th style='padding:4px 6px;text-align:center;'>Mức phạt</th>
                </tr>
                <tr style='background:#fff9f0;'>
                    <td style='padding:3px 6px;'>Nộp tờ khai chậm 1–30 ngày</td>
                    <td style='padding:3px 6px;text-align:center;'><b>2 – 5 triệu đồng</b></td>
                </tr>
                <tr>
                    <td style='padding:3px 6px;'>Nộp tờ khai chậm 31–60 ngày</td>
                    <td style='padding:3px 6px;text-align:center;'><b>5 – 8 triệu đồng</b></td>
                </tr>
                <tr style='background:#fff9f0;'>
                    <td style='padding:3px 6px;'>Nộp tờ khai chậm 61–90 ngày</td>
                    <td style='padding:3px 6px;text-align:center;'><b>8 – 15 triệu đồng</b></td>
                </tr>
                <tr>
                    <td style='padding:3px 6px;'>Nộp tờ khai chậm &gt; 90 ngày</td>
                    <td style='padding:3px 6px;text-align:center;'><b>15 – 25 triệu đồng</b></td>
                </tr>
                <tr style='background:#fff9f0;'>
                    <td style='padding:3px 6px;'>Khai sai → thiếu thuế</td>
                    <td style='padding:3px 6px;text-align:center;'><b>20% tiền thuế thiếu</b></td>
                </tr>
                <tr>
                    <td style='padding:3px 6px;'>Không xuất HĐ ≥ 50 số HĐ</td>
                    <td style='padding:3px 6px;text-align:center;'><b>60 – 80 triệu đồng</b></td>
                </tr>
                <tr style='background:#fff9f0;'>
                    <td style='padding:3px 6px;'>Chậm nộp tiền thuế</td>
                    <td style='padding:3px 6px;text-align:center;'><b>0.03%/ngày</b></td>
                </tr>
            </table>
            <small>💡 Tự khai bổ sung + nộp đủ trước khi CQT kiểm tra → <b>Không bị phạt</b></small>
        </div>

        <div style='background:#e8eaf6;padding:12px;border-radius:8px;border-left:5px solid #3f51b5;margin-bottom:8px;'>
            <b>✅ LỆ PHÍ MÔN BÀI 2026 (NĐ 22/2020/NĐ-CP):</b><br>
            Từ <b>01/01/2026</b>, toàn bộ Hộ kinh doanh được <b>MIỄN 100%</b> lệ phí môn bài. Không cần làm/nộp tờ khai môn bài nữa.
        </div>

        <div style='background:#fce4ec;padding:12px;border-radius:8px;border-left:5px solid #e91e63;margin-bottom:8px;'>
            <b>🔒 BẢO MẬT DỮ LIỆU KHÁCH HÀNG (NĐ 13/2023/NĐ-CP):</b><br>
            HKD thu thập thông tin (SĐT, Tên, Địa chỉ) để xuất HĐĐT <b>BẮT BUỘC</b> phải có sự đồng ý của khách hàng. Tuyệt đối không chia sẻ, mua bán dữ liệu.
        </div>

        <div style='background:#e0f7fa;padding:12px;border-radius:8px;border-left:5px solid #00bcd4;margin-bottom:8px;'>
            <b>🌐 NỘP THUẾ ĐIỆN TỬ & CHUẨN XML (TT 80/2021/TT-BTC):</b><br>
            Tờ khai 01/CNKD xuất từ phần mềm <b>ĐÃ ĐẠT CHUẨN XML</b> của Tổng cục Thuế. Vui lòng nộp trực tiếp tại <a href="https://thuedientu.gdt.gov.vn" style="color:#00838f;">eTax (thuedientu.gdt.gov.vn)</a> để tránh bị quá hạn (NĐ 126/2020).
        </div>

        <div style='background:#e8f5e9;padding:12px;border-radius:8px;border-left:5px solid #4caf50;margin-bottom:8px;'>
            <b>📒 Sổ kế toán bắt buộc (TT 152/2025/TT-BTC):</b><br>
            <small>Áp dụng từ 01/01/2026 — thay thế Thông tư 88/2021. Lưu trữ tối thiểu <b>5 năm</b>.</small>
            <ul>
                <li><b>S1a-HKD</b> — Sổ theo dõi doanh thu hàng ngày</li>
                <li><b>S2a-HKD</b> — Sổ theo dõi hàng tồn kho (Nhập-Xuất-Tồn)</li>
                <li><b>S3a-HKD</b> — Sổ theo dõi chi phí</li>
                <li>Có thể lưu trữ <b>điện tử hoặc bản giấy</b> (tự chọn)</li>
                <li>Chủ hộ tự ghi, thuê người thân, hoặc thuê <b>dịch vụ kế toán</b></li>
            </ul>
        </div>

        <p style='color:#6c757d;font-style:italic;font-size:11px;'>* Căn cứ: TT40/2021/TT-BTC Phụ lục I | TT152/2025/TT-BTC | NĐ123/2020/NĐ-CP | Luật 38/2019/QH14 | Luật 109/2025/QH15. Cập nhật: 27/02/2026</p>
        """

        lbl = QLabel(guide_text)
        lbl.setWordWrap(True)
        lbl.setOpenExternalLinks(True)
        lbl.setTextInteractionFlags(Qt.TextInteractionFlag.TextBrowserInteraction)
        
        c_layout.addWidget(lbl)
        c_layout.addStretch()

        scroll.setWidget(content)
        layout.addWidget(scroll)
        return w

    def _init_bia_tab(self) -> QWidget:
        """Thiết kế trang Bìa Sổ S1a-HKD chuẩn."""
        tab = QWidget()
        layout = QVBoxLayout(tab)
        layout.setContentsMargins(50, 50, 50, 50)
        layout.setSpacing(30)

        # Card chứa bìa
        card = CardFrame()
        card.setObjectName("card_bia")
        card.setStyleSheet(f"QFrame#card_bia {{ background: white; border: 1px solid {COLORS['border']}; border-radius: 15px; }}")
        
        card_layout = QVBoxLayout(card)
        card_layout.setContentsMargins(60, 80, 60, 80)
        card_layout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter)

        # Header: Lấy thông tin công ty từ Cài đặt
        main = self.window()
        company_info = getattr(main, "company_info", {}) or {}
        company_name = (
            company_info.get("legal_name")
            or company_info.get("name")
            or "............................................................"
        )
        company_tax = company_info.get("tax_id") or "...................................................................."
        company_addr = company_info.get("address") or "............................................................................"

        lbl_cq = QLabel(f"HỘ KINH DOANH: {company_name}")
        lbl_cq.setFont(QFont("Segoe UI", 12))
        lbl_cq.setAlignment(Qt.AlignmentFlag.AlignLeft)
        lbl_cq.setStyleSheet("color: #334155; margin-bottom: 5px;")
        
        lbl_mst = QLabel(f"Mã số thuế: {company_tax}")
        lbl_mst.setFont(QFont("Segoe UI", 12))
        lbl_mst.setAlignment(Qt.AlignmentFlag.AlignLeft)
        lbl_mst.setStyleSheet("color: #334155; margin-bottom: 5px;")

        lbl_addr = QLabel(f"Địa chỉ: {company_addr}")
        lbl_addr.setFont(QFont("Segoe UI", 12))
        lbl_addr.setAlignment(Qt.AlignmentFlag.AlignLeft)
        lbl_addr.setStyleSheet("color: #334155;")

        # Title: SỔ CHI TIẾT DOANH THU
        title_bia = QLabel("SỔ CHI TIẾT DOANH THU\nBÁN HÀNG HÓA, DỊCH VỤ")
        title_bia.setFont(QFont("Segoe UI", 32, QFont.Weight.Bold))
        title_bia.setAlignment(Qt.AlignmentFlag.AlignCenter)
        title_bia.setStyleSheet("color: #0f172a; margin-top: 80px; margin-bottom: 20px;")

        sub_title = QLabel("(Mẫu số S1a-HKD)")
        sub_title.setFont(QFont("Segoe UI", 16, QFont.Weight.DemiBold))
        sub_title.setAlignment(Qt.AlignmentFlag.AlignCenter)
        sub_title.setStyleSheet("color: #64748b;")

        # Năm
        current_year = datetime.now().year
        self.lbl_year_bia = QLabel(f"Năm: {current_year}")
        self.lbl_year_bia.setFont(QFont("Times New Roman", 18, QFont.Weight.Bold))
        self.lbl_year_bia.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.lbl_year_bia.setStyleSheet("margin-top: 50px; color: #1e293b;")

        # Footer: Thông tin thông tư
        footer_info = QLabel("Theo Thông tư số 152/2025/TT-BTC\nNgày 28/01/2025 của Bộ Tài chính")
        footer_info.setFont(QFont("Segoe UI", 12, QFont.Weight.Light))
        footer_info.setAlignment(Qt.AlignmentFlag.AlignCenter)
        footer_info.setStyleSheet("color: #94a3b8; margin-top: 100px;")

        # Gom layout
        card_layout.addWidget(lbl_cq)
        card_layout.addWidget(lbl_mst)
        card_layout.addWidget(lbl_addr)
        card_layout.addStretch(1)
        card_layout.addWidget(title_bia)
        card_layout.addWidget(sub_title)
        card_layout.addWidget(self.lbl_year_bia)
        card_layout.addStretch(1)
        card_layout.addWidget(footer_info)

        # Bọc card vào một container để scroll nếu cần
        layout.addWidget(card)
        return tab
