# ============================================================
# core/tax_report.py
# Tính toán và báo cáo thuế GTGT (đầu ra / đầu vào)
# CLI: python core/cli.py company CTY001 tax-gtgt --month 2026-02
# ============================================================

import sqlite3
import os
from datetime import datetime
from typing import Optional

try:
    import openpyxl
    from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
    from openpyxl.utils import get_column_letter
    HAS_OPENPYXL = True
except ImportError:
    HAS_OPENPYXL = False


# ─── Tính toán thuế GTGT ─────────────────────────────────────

def calc_gtgt(conn: sqlite3.Connection, year: int, month: int) -> dict:
    """
    Tính thuế GTGT phải nộp trong kỳ.
    Trả về dict với đầu vào, đầu ra, và thuế phải nộp.
    """
    c = conn.cursor()

    # ── GTGT Đầu ra (output) — Doanh thu bán hàng ──────────
    rows_out = c.execute("""
        SELECT
            v.vat_rate,
            SUM(v.pretax_amount)  AS doanh_thu,
            SUM(v.vat_amount)     AS thue_dau_ra
        FROM invoices v
        WHERE v.invoice_type = 'output'
          AND v.status != 'cancelled'
          AND strftime('%Y', v.invoice_date) = ?
          AND strftime('%m', v.invoice_date) = ?
        GROUP BY v.vat_rate
        ORDER BY v.vat_rate DESC
    """, (str(year), f"{month:02d}")).fetchall()

    # ── GTGT Đầu vào (input) — Chi phí mua hàng ───────────
    rows_in = c.execute("""
        SELECT
            v.vat_rate,
            SUM(v.pretax_amount)  AS gia_tri_mua,
            SUM(v.vat_amount)     AS thue_dau_vao
        FROM invoices v
        WHERE v.invoice_type = 'input'
          AND v.status != 'cancelled'
          AND strftime('%Y', v.invoice_date) = ?
          AND strftime('%m', v.invoice_date) = ?
        GROUP BY v.vat_rate
        ORDER BY v.vat_rate DESC
    """, (str(year), f"{month:02d}")).fetchall()

    # ── Tổng hợp ───────────────────────────────────────────
    total_out_pretax = sum(r[1] for r in rows_out)
    total_out_vat    = sum(r[2] for r in rows_out)
    total_in_pretax  = sum(r[1] for r in rows_in)
    total_in_vat     = sum(r[2] for r in rows_in)

    thue_phai_nop = max(0, total_out_vat - total_in_vat)
    thue_dau_vao_du = max(0, total_in_vat - total_out_vat)  # Dư sang kỳ sau

    return {
        "period": f"{year}-{month:02d}",
        "output": {
            "by_rate": rows_out,          # [(vat_rate, pretax, vat_amount), ...]
            "total_pretax": total_out_pretax,
            "total_vat": total_out_vat,
        },
        "input": {
            "by_rate": rows_in,
            "total_pretax": total_in_pretax,
            "total_vat": total_in_vat,
        },
        "thue_phai_nop": thue_phai_nop,
        "thue_dau_vao_du": thue_dau_vao_du,
    }


def print_gtgt_report(data: dict) -> None:
    """In tóm tắt thuế GTGT ra console."""
    fmt = lambda x: f"{x:>16,.0f}"
    period = data["period"]
    out = data["output"]
    inp = data["input"]

    print(f"\n{'='*55}")
    print(f"  TỜ KHAI THUẾ GTGT — KỲ {period}")
    print(f"{'='*55}")

    print(f"\n📤 GTGT ĐẦU RA (Doanh thu bán hàng/dịch vụ):")
    print(f"  {'Thuế suất':<15} {'Doanh thu (chưa VAT)':>20} {'Thuế GTGT đầu ra':>17}")
    print(f"  {'-'*54}")
    for rate, pretax, vat in out["by_rate"]:
        rate_str = f"{int(rate*100)}%" if rate else "Không chịu"
        print(f"  {rate_str:<15} {fmt(pretax)} {fmt(vat)}")
    print(f"  {'TỔNG':<15} {fmt(out['total_pretax'])} {fmt(out['total_vat'])}")

    print(f"\n📥 GTGT ĐẦU VÀO (Chi phí mua hàng/dịch vụ):")
    print(f"  {'Thuế suất':<15} {'Giá trị mua (chưa VAT)':>20} {'Thuế GTGT đầu vào':>17}")
    print(f"  {'-'*54}")
    for rate, pretax, vat in inp["by_rate"]:
        rate_str = f"{int(rate*100)}%" if rate else "Không chịu"
        print(f"  {rate_str:<15} {fmt(pretax)} {fmt(vat)}")
    print(f"  {'TỔNG':<15} {fmt(inp['total_pretax'])} {fmt(inp['total_vat'])}")

    print(f"\n{'─'*55}")
    phai_nop = data["thue_phai_nop"]
    du       = data["thue_dau_vao_du"]

    if phai_nop > 0:
        print(f"  ✅ THUẾ GTGT PHẢI NỘP   : {fmt(phai_nop)} VND")
        print(f"     Hạn nộp: ngày 20/{int(period[5:7])%12+1 or 12}/{period[:4]}")
    else:
        print(f"  ♻️  THUẾ ĐẦU VÀO DƯ     : {fmt(du)} VND (chuyển sang kỳ sau)")
    print(f"{'='*55}\n")


# ─── Xuất Excel (Mẫu 01/GTGT đơn giản) ──────────────────────

def export_gtgt_excel(data: dict, out_dir: str, company_name: str = "") -> str:
    """Xuất báo cáo GTGT ra Excel. Trả về đường dẫn file."""
    if not HAS_OPENPYXL:
        raise ImportError("Cần cài openpyxl: pip install openpyxl")

    os.makedirs(out_dir, exist_ok=True)
    period = data["period"]
    fname  = f"TKhai_GTGT_{period.replace('-','_')}.xlsx"
    fpath  = os.path.join(out_dir, fname)

    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = f"GTGT {period}"

    # ── Styles ─────────────────────────────────────────────
    navy = "1F3864"
    blue = "2E75B6"
    green = "375623"
    light_blue = "D6E4F0"
    light_green = "E2EFDA"
    light_red = "FCE4D6"

    h1 = Font(name="Arial", bold=True, size=14, color="FFFFFF")
    h2 = Font(name="Arial", bold=True, size=11, color="FFFFFF")
    body = Font(name="Arial", size=10)
    bold = Font(name="Arial", bold=True, size=10)
    center = Alignment(horizontal="center", vertical="center")
    left   = Alignment(horizontal="left", vertical="center")
    right  = Alignment(horizontal="right", vertical="center")

    thin = Side(style="thin", color="BFBFBF")
    bd   = Border(left=thin, right=thin, top=thin, bottom=thin)

    def fill(hex_color):
        return PatternFill("solid", fgColor=hex_color)

    def money(val):
        return val if val else 0

    # ── Tiêu đề ────────────────────────────────────────────
    ws.merge_cells("A1:F1")
    ws["A1"] = "TỜ KHAI THUẾ GIÁ TRỊ GIA TĂNG (Mẫu 01/GTGT)"
    ws["A1"].font = h1
    ws["A1"].fill = fill(navy)
    ws["A1"].alignment = center
    ws.row_dimensions[1].height = 30

    ws.merge_cells("A2:F2")
    ws["A2"] = f"Kỳ tính thuế: Tháng {period[5:7]}/{period[:4]}  |  {company_name}"
    ws["A2"].font = Font(name="Arial", bold=True, size=11)
    ws["A2"].alignment = center
    ws.row_dimensions[2].height = 20

    ws.row_dimensions[3].height = 10  # spacer

    # ── Header bảng ────────────────────────────────────────
    headers = ["STT", "Nội dung", "Doanh số/Giá trị (chưa VAT)", "Thuế suất", "Thuế GTGT", "Ghi chú"]
    col_widths = [6, 40, 25, 12, 20, 20]
    for i, (h, w) in enumerate(zip(headers, col_widths), 1):
        cell = ws.cell(row=4, column=i, value=h)
        cell.font = h2
        cell.fill = fill(blue)
        cell.alignment = center
        cell.border = bd
        ws.column_dimensions[get_column_letter(i)].width = w
    ws.row_dimensions[4].height = 22

    row = 5

    # ── GTGT ĐẦU RA ────────────────────────────────────────
    ws.merge_cells(f"A{row}:F{row}")
    ws[f"A{row}"] = "I. THUẾ GTGT ĐẦU RA — HÀNG BÁN RA"
    ws[f"A{row}"].font = Font(name="Arial", bold=True, size=10, color="FFFFFF")
    ws[f"A{row}"].fill = fill(green)
    ws[f"A{row}"].alignment = left
    ws.row_dimensions[row].height = 18
    row += 1

    out = data["output"]
    for idx, (rate, pretax, vat) in enumerate(out["by_rate"], 1):
        rate_str = f"{int(rate*100)}%" if rate else "Không chịu thuế"
        for col, val in enumerate([idx, f"Hàng hóa/dịch vụ chịu thuế {rate_str}",
                                    money(pretax), rate_str, money(vat), ""], 1):
            cell = ws.cell(row=row, column=col, value=val)
            cell.font = body
            cell.fill = fill(light_green) if row % 2 == 0 else fill("FFFFFF")
            cell.alignment = right if col in [3, 5] else left
            cell.border = bd
            if col in [3, 5]:
                cell.number_format = '#,##0'
        ws.row_dimensions[row].height = 16
        row += 1

    # Tổng đầu ra
    for col, val in enumerate(["", "TỔNG THUẾ GTGT ĐẦU RA",
                                money(out["total_pretax"]), "", money(out["total_vat"]), ""], 1):
        cell = ws.cell(row=row, column=col, value=val)
        cell.font = bold
        cell.fill = fill("C6EFCE")
        cell.alignment = right if col in [3, 5] else left
        cell.border = bd
        if col in [3, 5]:
            cell.number_format = '#,##0'
    ws.row_dimensions[row].height = 18
    row += 2

    # ── GTGT ĐẦU VÀO ───────────────────────────────────────
    ws.merge_cells(f"A{row}:F{row}")
    ws[f"A{row}"] = "II. THUẾ GTGT ĐẦU VÀO — HÀNG MUA VÀO"
    ws[f"A{row}"].font = Font(name="Arial", bold=True, size=10, color="FFFFFF")
    ws[f"A{row}"].fill = fill("C55A11")
    ws[f"A{row}"].alignment = left
    ws.row_dimensions[row].height = 18
    row += 1

    inp = data["input"]
    for idx, (rate, pretax, vat) in enumerate(inp["by_rate"], 1):
        rate_str = f"{int(rate*100)}%" if rate else "Không chịu thuế"
        for col, val in enumerate([idx, f"Hàng hóa/dịch vụ mua vào {rate_str}",
                                    money(pretax), rate_str, money(vat), ""], 1):
            cell = ws.cell(row=row, column=col, value=val)
            cell.font = body
            cell.fill = fill(light_red) if row % 2 == 0 else fill("FFFFFF")
            cell.alignment = right if col in [3, 5] else left
            cell.border = bd
            if col in [3, 5]:
                cell.number_format = '#,##0'
        ws.row_dimensions[row].height = 16
        row += 1

    for col, val in enumerate(["", "TỔNG THUẾ GTGT ĐẦU VÀO",
                                money(inp["total_pretax"]), "", money(inp["total_vat"]), ""], 1):
        cell = ws.cell(row=row, column=col, value=val)
        cell.font = bold
        cell.fill = fill("FFCCCC")
        cell.alignment = right if col in [3, 5] else left
        cell.border = bd
        if col in [3, 5]:
            cell.number_format = '#,##0'
    ws.row_dimensions[row].height = 18
    row += 2

    # ── KẾT QUẢ ────────────────────────────────────────────
    phai_nop = data["thue_phai_nop"]
    dau_vao_du = data["thue_dau_vao_du"]

    result_rows = [
        ("III", "THUẾ GTGT ĐẦU RA", "", money(out["total_vat"])),
        ("",    "THUẾ GTGT ĐẦU VÀO ĐƯỢC KHẤU TRỪ", "", money(inp["total_vat"])),
        ("",    "THUẾ GTGT PHẢI NỘP (= Đầu ra − Đầu vào)",
                "", money(phai_nop) if phai_nop > 0 else 0),
        ("",    "THUẾ ĐẦU VÀO DƯ (Chuyển kỳ sau)",
                "", money(dau_vao_du) if dau_vao_du > 0 else 0),
    ]

    ws.merge_cells(f"A{row}:F{row}")
    ws[f"A{row}"] = "III. KẾT QUẢ"
    ws[f"A{row}"].font = Font(name="Arial", bold=True, size=10, color="FFFFFF")
    ws[f"A{row}"].fill = fill(navy)
    ws[f"A{row}"].alignment = left
    ws.row_dimensions[row].height = 18
    row += 1

    for stt, noi_dung, _, so_tien in result_rows:
        highlight = fill("FFFF99") if "PHẢI NỘP" in noi_dung else fill(light_blue)
        for col, val in enumerate([stt, noi_dung, "", "", so_tien, ""], 1):
            cell = ws.cell(row=row, column=col, value=val)
            cell.font = bold if "PHẢI NỘP" in noi_dung else body
            cell.fill = highlight
            cell.alignment = right if col == 5 else left
            cell.border = bd
            if col == 5:
                cell.number_format = '#,##0'
        ws.row_dimensions[row].height = 18
        row += 1

    # ── Footer ─────────────────────────────────────────────
    row += 1
    ws.merge_cells(f"A{row}:F{row}")
    ws[f"A{row}"] = (f"Ngày lập: {datetime.now().strftime('%d/%m/%Y')}  |  "
                     f"Hạn nộp thuế: 20/{int(period[5:7])%12+1 or 12}/{period[:4]}  |  "
                     f"Xuất từ hệ thống Accountant v2.1")
    ws[f"A{row}"].font = Font(name="Arial", italic=True, size=9, color="808080")
    ws[f"A{row}"].alignment = center

    # Freeze header
    ws.freeze_panes = "A5"

    wb.save(fpath)
    return fpath


# ─── Entry point ─────────────────────────────────────────────

def run_tax_gtgt(db_path: str, year: int, month: int,
                 out_dir: Optional[str] = None,
                 company_name: str = "") -> None:
    """
    Chạy báo cáo thuế GTGT cho 1 kỳ.
    Nếu out_dir được truyền vào → xuất Excel.
    """
    conn = sqlite3.connect(db_path)
    conn.row_factory = sqlite3.Row

    data = calc_gtgt(conn, year, month)
    print_gtgt_report(data)

    if out_dir:
        fpath = export_gtgt_excel(data, out_dir, company_name)
        print(f"📄 Đã xuất: {fpath}")

    conn.close()
    return data
