"""
reports_module.py — Báo Cáo Tài Chính & Thuế
Danh sách các loại báo cáo, chọn kỳ và xuất file.
"""
import os
import sys
from PySide6.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFrame,
    QPushButton, QScrollArea, QGridLayout, QComboBox, QMessageBox
)
from PySide6.QtCore import Qt
from PySide6.QtGui import QFont

from gui.theme import COLORS


REPORT_TYPES = [
    {
        "id": "trial_balance",
        "icon": "📊",
        "name": "Bảng Cân Đối Số Phát Sinh",
        "desc": "BĐSP tổng hợp tất cả tài khoản theo tháng/quý/năm",
        "tag": "Excel",
        "tag_color": COLORS["success"],
    },
    {
        "id": "hkd_01_appendix",
        "icon": "📋",
        "name": "Phụ lục 01-2/BK-HĐKD",
        "desc": "Bảng kê chi tiết HĐKD (Bắt buộc nộp kèm Mẫu 01/CNKD)",
        "tag": "Word",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "general_ledger",
        "icon": "📋",
        "name": "Sổ Cái Tài Khoản",
        "desc": "Chi tiết phát sinh từng tài khoản kế toán",
        "tag": "Excel",
        "tag_color": COLORS["success"],
    },
    {
        "id": "tax_gtgt",
        "icon": "🧾",
        "name": "Báo Cáo Thuế GTGT",
        "desc": "Tổng hợp thuế đầu vào / đầu ra / thuế phải nộp theo tháng",
        "tag": "Excel",
        "tag_color": COLORS["success"],
    },
    {
        "id": "tax_tndn",
        "icon": "🏢",
        "name": "Tờ Khai Thuế TNDN",
        "desc": "Mẫu 03/TNDN — Quyết toán thuế Thu nhập Doanh nghiệp",
        "tag": "Excel",
        "tag_color": COLORS["success"],
    },
    {
        "id": "hkd_01",
        "icon": "🏪",
        "name": "Mẫu 01/CNKD — HKD Kê Khai",
        "desc": "Tờ khai thuế HKD kê khai (từ 01/01/2026, thay thuế khoán)",
        "tag": "Word",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "bctc",
        "icon": "💼",
        "name": "Báo Cáo Tài Chính Năm (BCTC)",
        "desc": "Bảng CĐKT + Kết quả HĐKD + Lưu chuyển tiền tệ",
        "tag": "Excel",
        "tag_color": COLORS["warning"],
    },
    {
        "id": "s2a_hkd",
        "icon": "📒",
        "name": "Sổ S2a-HKD: Doanh Thu",
        "desc": "Sổ doanh thu bán hàng hóa, dịch vụ theo TT 152/2025",
        "tag": "Excel",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "s1a_hkd",
        "icon": "📘",
        "name": "Mẫu số S1a-HKD: Sổ Doanh Thu",
        "desc": "Xuất sổ doanh thu dạng 3 cột: Ngày tháng, Diễn giải, Số tiền",
        "tag": "Excel",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "s2c_hkd",
        "icon": "📈",
        "name": "Sổ S2c-HKD: Chi Tiết Doanh Thu, Chi Phí",
        "desc": "Ghi nhận chi phí để tính thuế theo lợi nhuận (15/17/20%)",
        "tag": "Excel",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "s2d_hkd",
        "icon": "📦",
        "name": "Sổ S2d-HKD: Vật Tư, Hàng Hóa",
        "desc": "Sổ theo dõi Nhập-Xuất-Tồn kho vật tư dụng cụ",
        "tag": "Excel",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "s2e_hkd",
        "icon": "💰",
        "name": "Sổ S2e-HKD: Chi Tiết Tiền",
        "desc": "Theo dõi dòng tiền mặt và tiền gửi ngân hàng của HKD",
        "tag": "Excel",
        "tag_color": COLORS["accent_light"],
    },
    {
        "id": "ar_ap",
        "icon": "🔄",
        "name": "Công Nợ AR / AP Aging",
        "desc": "Phân tích tuổi nợ phải thu / phải trả",
        "tag": "Excel",
        "tag_color": COLORS["success"],
    },
    {
        "id": "deadline",
        "icon": "📅",
        "name": "Lịch Hạn Nộp Thuế",
        "desc": "Deadline thuế tất cả công ty trong tháng/quý",
        "tag": "Console",
        "tag_color": COLORS["text_muted"],
    },
]

BASIC_REPORT_IDS = {"hkd_01", "hkd_01_appendix", "s1a_hkd"}


class ReportCard(QFrame):
    """Card cho mỗi loại báo cáo."""

    def __init__(self, report: dict, on_export, parent=None):
        super().__init__(parent)
        self.setObjectName("card")
        self.setMinimumHeight(110)

        layout = QHBoxLayout(self)
        layout.setContentsMargins(16, 14, 16, 14)
        layout.setSpacing(14)

        # Icon
        icon_lbl = QLabel(report["icon"])
        icon_lbl.setFont(QFont("Segoe UI", 24))
        icon_lbl.setFixedWidth(44)
        icon_lbl.setAlignment(Qt.AlignmentFlag.AlignCenter)
        icon_lbl.setStyleSheet("background: transparent;")
        layout.addWidget(icon_lbl)

        # Info
        info = QVBoxLayout()
        info.setSpacing(3)

        name_row = QHBoxLayout()
        name_lbl = QLabel(report["name"])
        name_lbl.setFont(QFont("Segoe UI", 10, QFont.Weight.Bold))
        name_lbl.setStyleSheet(f"color: {COLORS['text_primary']}; background: transparent;")

        tag_lbl = QLabel(f"  {report['tag']}  ")
        tag_lbl.setFont(QFont("Segoe UI", 8, QFont.Weight.Bold))
        tag_lbl.setStyleSheet(
            f"color: {report['tag_color']}; background: transparent; "
            f"border: 1px solid {report['tag_color']}; border-radius: 4px; padding: 1px 4px;"
        )
        name_row.addWidget(name_lbl)
        name_row.addWidget(tag_lbl)
        name_row.addStretch()
        info.addLayout(name_row)

        desc_lbl = QLabel(report["desc"])
        desc_lbl.setObjectName("label_muted")
        desc_lbl.setFont(QFont("Segoe UI", 9))
        desc_lbl.setStyleSheet(f"color: {COLORS['text_muted']}; background: transparent;")
        desc_lbl.setWordWrap(True)
        info.addWidget(desc_lbl)

        layout.addLayout(info, stretch=1)

        # Export button
        btn = QPushButton("Xuất →")
        btn.setFixedSize(90, 36)
        
        btn_style = "btn_secondary"
        if report["tag"] == "Excel":
            btn_style = "btn_success"
        elif report["tag"] == "Word":
            btn_style = "btn_primary"
            
        btn.setObjectName(btn_style)
        btn.clicked.connect(lambda: on_export(report["id"]))
        layout.addWidget(btn)


class ReportsPage(QWidget):
    """Module báo cáo tài chính và thuế."""

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName("content_area")

        root = QVBoxLayout(self)
        root.setContentsMargins(0, 0, 0, 0)
        root.setSpacing(0)

        # ── Filter toolbar ─────────────────────────────────
        toolbar = QWidget()
        toolbar.setMaximumHeight(58)
        t_layout = QHBoxLayout(toolbar)
        t_layout.setContentsMargins(16, 8, 16, 8)
        t_layout.setSpacing(12)

        t_layout.addWidget(QLabel("Kỳ báo cáo:"))
        self.combo_period = QComboBox()
        self.combo_period.addItems([
            "Tháng 02/2026", "Tháng 01/2026",
            "Quý 1/2026", "Năm 2025", "Năm 2026"
        ])
        self.combo_period.setFixedHeight(34)
        self.combo_period.setMinimumWidth(160)
        t_layout.addWidget(self.combo_period)
        t_layout.addStretch()
        root.addWidget(toolbar)

        # ── Scrollable report list ──────────────────────────
        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        scroll.setFrameShape(QFrame.Shape.NoFrame)

        body = QWidget()
        body_layout = QVBoxLayout(body)
        body_layout.setContentsMargins(16, 15, 16, 15)
        body_layout.setSpacing(10)

        for report in REPORT_TYPES:
            card = ReportCard(report, self._on_export)
            body_layout.addWidget(card)

        body_layout.addStretch()
        scroll.setWidget(body)
        root.addWidget(scroll)

    def _on_export(self, report_id: str):
        period = self.combo_period.currentText()
        main = self.window()
        db_path = getattr(main, "current_db_path", "")
        from core.licensing import format_plan_label, get_effective_plan_limits

        plan_id = getattr(main, "plan_type", "free") if main else "free"
        license_context = getattr(main, "license_context", {}) if main else {}
        limits = getattr(main, "effective_plan_limits", {}) or get_effective_plan_limits(plan_id, license_context)
        if not limits.get("has_report"):
            QMessageBox.warning(
                self,
                "Báo cáo",
                f"Gói hiện tại ({format_plan_label(plan_id)}) chưa bao gồm tính năng báo cáo.",
            )
            return
        if not limits.get("has_advanced_report") and report_id not in BASIC_REPORT_IDS:
            QMessageBox.warning(
                self,
                "Báo cáo nâng cao",
                "Gói STARTER chỉ bao gồm 3 báo cáo cơ bản. Vui lòng dùng TRIAL, PRO hoặc OFFICE để xuất báo cáo nâng cao.",
            )
            return

        year = 2026
        month = None
        quarter = None
        if "Tháng" in period:
            parts = period.replace("Tháng ", "").split("/")
            month = int(parts[0])
            year = int(parts[1])
        elif "Quý" in period:
            parts = period.replace("Quý ", "").split("/")
            quarter = int(parts[0])
            year = int(parts[1])
        elif "Năm" in period:
            year = int(period.replace("Năm", "").strip())
        
        if not db_path or not os.path.exists(db_path):
            QMessageBox.warning(self, "⚠️", "Vui lòng kết nối Database trước khi xuất báo cáo.")
            return

        try:
            # Xác định thư mục lưu trữ
            output_dir = os.path.join(os.path.expanduser("~"), "Documents", "Accountant_Reports")
            os.makedirs(output_dir, exist_ok=True)
            
            if report_id in ["hkd_01", "hkd_01_appendix"]:
                try:
                    from core.reporting import TaxReportGenerator
                    
                    # Tìm mẫu template
                    root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
                    if report_id == "hkd_01":
                        template_name = "Mau-so-01-CNKD-To-khai-thue-doi-voi-ho-kinh-doanh-ca-the-kinh-doanh.docx"
                    else:
                        template_name = "Mau-so-01-2-BK-HDKD-Phu-luc-bang-ke-hoat-dong-kinh-doanh-trong-ky-cua-ho-kinh-doanh-ca-nhan-kinh-doanh.docx"
                        
                    template_path = os.path.join(root_dir, "data", "input", "tax_docs", template_name)
                    info_path = os.path.join(root_dir, "settings.json")
                    from core.revenue_db import get_revenue_db_path
                    revenue_db_path = get_revenue_db_path()
                    
                    if not os.path.exists(template_path):
                        QMessageBox.critical(self, "❌ Lỗi", f"Không tìm thấy mẫu tại:\n{template_path}")
                        return
                        
                    gen = TaxReportGenerator(template_path, revenue_db_path, info_path)
                    
                    save_path = gen.generate(year, month, quarter)
                    
                    QMessageBox.information(self, "✅ Thành công", f"Đã xuất báo cáo tại:\n{save_path}")
                    os.startfile(os.path.dirname(save_path))
                    return
                except Exception as e:
                    QMessageBox.critical(self, "❌ Lỗi", f"Lỗi khi tạo báo cáo Word: {e}")
                    return
                
            filename = f"BaoCao_{report_id}_{period.replace('/', '_')}.xlsx"
            save_path = os.path.join(output_dir, filename)

            if report_id == "s1a_hkd":
                from core.reports.hkd_report import export_s1a_hkd_revenue

                save_path = export_s1a_hkd_revenue(
                    year=year,
                    month=month,
                    quarter=quarter,
                    output_path=save_path,
                )
                QMessageBox.information(self, "✅ Thành công", f"Đã xuất báo cáo tại:\n{save_path}")
                os.startfile(os.path.dirname(save_path))
                return
            
            # Logic xuất báo cáo
            if report_id in ["s2a_hkd", "s2c_hkd", "s2d_hkd", "s2e_hkd"]:
                from core.reports.hkd_report import get_S2a_data, get_S2c_data, get_S2d_data, get_S2e_data
                from openpyxl import Workbook
                from openpyxl.styles import Font, Alignment, Border, Side
                
                wb = Workbook()
                ws = wb.active
                
                # Header chung
                ws.merge_cells('A1:E1')
                ws['A1'] = "CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM"
                ws['A1'].font = Font(bold=True)
                ws['A1'].alignment = Alignment(horizontal="center")
                
                # Data specific logic
                if report_id == "s2a_hkd":
                    ws.title = "S2a-HKD"
                    ws['A3'] = "SỔ DOANH THU BÁN HÀNG HÓA, DỊCH VỤ (MẪU S2a-HKD)"
                    results = get_S2a_data(db_path, year, month)
                elif report_id == "s2c_hkd":
                    ws.title = "S2c-HKD"
                    ws['A3'] = "SỔ CHI TIẾT DOANH THU, CHI PHÍ (MẪU S2c-HKD)"
                    results = get_S2c_data(db_path, year, month)
                elif report_id == "s2d_hkd":
                    ws.title = "S2d-HKD"
                    ws['A3'] = "SỔ CHI TIẾT VẬT TƯ, HÀNG HÓA (MẪU S2d-HKD)"
                    results = get_S2d_data(db_path)
                elif report_id == "s2e_hkd":
                    ws.title = "S2e-HKD"
                    ws['A3'] = "SỔ CHI TIẾT TIỀN (MẪU S2e-HKD)"
                    results = get_S2e_data(db_path, year, month)
                    for i, r in enumerate(results, 6):
                        ws.cell(row=i, column=1, value=r['voucher_date'])
                        ws.cell(row=i, column=2, value=r['voucher_no'])
                        ws.cell(row=i, column=3, value=r['description'])
                        ws.cell(row=i, column=4, value=r['credit'])
                else:
                    ws.title = "S02-HKD"
                    ws['A3'] = "SỔ THEO DÕI VẬT TƯ, CÔNG CỤ, DỤNG CỤ, HÀNG HÓA"
                    results = get_S02_data(db_path)
                    ws['A5'], ws['B5'], ws['C5'], ws['D5'], ws['E5'] = "STT", "Tên hàng", "Tồn đầu", "Nhập", "Xuất"
                    for i, r in enumerate(results, 6):
                        ws.cell(row=i, column=1, value=i-5)
                        ws.cell(row=i, column=2, value=r['name'])
                        ws.cell(row=i, column=3, value=r['opening_qty'])
                        ws.cell(row=i, column=4, value=r['total_in'])
                        ws.cell(row=i, column=5, value=r['total_out'])

                wb.save(save_path)
                QMessageBox.information(self, "✅ Thành công", f"Đã xuất báo cáo tại:\n{save_path}")
                os.startfile(os.path.dirname(save_path))
            
            elif report_id in ["trial_balance", "general_ledger", "tax_gtgt"]:
                from openpyxl import Workbook
                wb = Workbook()
                ws = wb.active
                ws.title = report_id[:30]
                ws["A1"] = f"BÁO CÁO: {report_id.upper()}"
                ws["A2"] = f"KỲ: {period}"
                ws["A3"] = "Dữ liệu được trích xuất từ hệ thống INI HKD v1.0."
                ws["A5"] = "STT"
                ws["B5"] = "Nội dung"
                ws["C5"] = "Số tiền"
                
                # Trong thực tế phần này sẽ kết nối SQL để nạp data vào Sheets
                wb.save(save_path)
                    
                QMessageBox.information(self, "✅ Thành công", f"Đã xuất báo cáo tại:\n{save_path}")
                if os.path.exists(save_path):
                    os.startfile(os.path.dirname(save_path))
            else:
                QMessageBox.information(self, "💡 Gợi ý", f"Tính năng xuất '{report_id}' đang được cập nhật trong bản tới.")
                
        except Exception as e:
            QMessageBox.critical(self, "❌ Lỗi", f"Không thể xuất báo cáo: {e}")
