# ============================================================
# core/deadline_tracker.py
# Nhắc lịch hạn nộp thuế cho tất cả công ty
# CLI: python core/cli.py deadlines --month 2026-02
# ============================================================

import os
import json
from datetime import datetime, date
from typing import Optional

COMPANIES_DIR = os.path.join(os.path.dirname(__file__), "..", "companies")
INDEX_FILE    = os.path.join(COMPANIES_DIR, "_index.json")


# ─── Danh sách hạn nộp thuế chuẩn ───────────────────────────

def get_deadlines(year: int, month: int) -> list:
    """
    Trả về danh sách hạn nộp thuế trong tháng year-month.
    Áp dụng cho cả doanh nghiệp và HKD.
    """
    next_month = month % 12 + 1
    next_year  = year + 1 if month == 12 else year

    def d(day, mon=next_month, yr=next_year):
        return date(yr, mon, day)

    items = []

    # ── Hạn ngày 20 hàng tháng ──────────────────────────────
    items += [
        {
            "deadline": d(20),
            "name": "Nộp thuế GTGT tháng",
            "description": f"Tờ khai + nộp thuế GTGT tháng {month:02d}/{year}",
            "who": "DN khai thuế GTGT tháng",
            "type": "GTGT",
            "urgency": "HIGH",
        },
        {
            "deadline": d(20),
            "name": "Nộp thuế TNCN khấu trừ",
            "description": f"Khấu trừ TNCN tháng {month:02d}/{year}",
            "who": "DN có khấu trừ TNCN tháng",
            "type": "TNCN",
            "urgency": "HIGH",
        },
        {
            "deadline": d(20),
            "name": "Nộp thuế HKD (GTGT + TNCN)",
            "description": f"HKD nộp thuế tháng {month:02d}/{year} (theo NQ 198/2025)",
            "who": "Hộ kinh doanh",
            "type": "HKD",
            "urgency": "HIGH",
        },
    ]

    # ── Hạn ngày 30/31 cuối tháng ───────────────────────────
    # Nếu là tháng kết thúc quý → thêm nhắc TNDN tạm tính
    if month in [3, 6, 9, 12]:
        quy = {3: 1, 6: 2, 9: 3, 12: 4}[month]
        items.append({
            "deadline": d(30, month, year),  # Cuối tháng trong kỳ
            "name": f"Nộp TNDN tạm tính Q{quy}/{year}",
            "description": f"Tạm nộp thuế TNDN quý {quy} (≥75% số phải nộp cả năm)",
            "who": "Doanh nghiệp",
            "type": "TNDN",
            "urgency": "HIGH",
        })

    # ── Nhắc đặc biệt tháng 3 (quyết toán năm trước) ───────
    if month == 3:
        items.append({
            "deadline": d(31, 3, year),
            "name": f"Quyết toán TNDN năm {year-1}",
            "description": f"Nộp tờ khai + quyết toán thuế TNDN + BCTC năm {year-1}",
            "who": "Tất cả doanh nghiệp",
            "type": "TNDN_QT",
            "urgency": "CRITICAL",
        })
        items.append({
            "deadline": d(31, 3, year),
            "name": f"Quyết toán TNCN năm {year-1}",
            "description": f"Nộp tờ khai quyết toán TNCN năm {year-1} (nếu có NLĐ)",
            "who": "DN có nhân viên",
            "type": "TNCN_QT",
            "urgency": "CRITICAL",
        })

    # ── Nhắc đặc biệt tháng 1 (môn bài) ────────────────────
    if month == 1:
        items.append({
            "deadline": d(30, 1, year),
            "name": f"Lệ phí môn bài năm {year}",
            "description": "Nộp lệ phí môn bài nếu không được miễn (xem NQ 198/2025)",
            "who": "DN mới / có thay đổi vốn",
            "type": "MON_BAI",
            "urgency": "MEDIUM",
        })

    items.sort(key=lambda x: x["deadline"])
    return items


def print_deadlines(year: int, month: int) -> None:
    items = get_deadlines(year, month)
    today = date.today()

    print(f"\n{'='*65}")
    print(f"  LỊCH HẠN NỘP THUẾ — THÁNG {month:02d}/{year}")
    print(f"  Hôm nay: {today.strftime('%d/%m/%Y')}")
    print(f"{'='*65}")

    for item in items:
        dl    = item["deadline"]
        days_left = (dl - today).days
        icon  = "🔴" if item["urgency"] == "CRITICAL" else "🟡" if days_left <= 5 else "🟢"
        urgency_str = f"({days_left} ngày nữa)" if days_left >= 0 else f"(⚠️ QUÁ HẠN {-days_left} ngày)"

        print(f"\n  {icon} {dl.strftime('%d/%m/%Y')} — {item['name']} {urgency_str}")
        print(f"     📌 {item['description']}")
        print(f"     👥 Áp dụng: {item['who']}")

    print(f"\n{'='*65}\n")


def print_all_companies_deadlines(year: int, month: int) -> None:
    """In nhắc hạn nộp thuế cho tất cả công ty trong index."""
    items = get_deadlines(year, month)
    today = date.today()

    # Đọc danh sách công ty
    companies = []
    if os.path.exists(INDEX_FILE):
        with open(INDEX_FILE, encoding="utf-8") as f:
            idx = json.load(f)
        companies = [c for c in idx.get("companies", []) if c.get("status") == "active"]

    print(f"\n{'='*65}")
    print(f"  LỊCH HẠN NỘP THUẾ — THÁNG {month:02d}/{year}")
    if companies:
        print(f"  Quản lý {len(companies)} công ty đang hoạt động")
    print(f"{'='*65}")

    for item in items:
        dl = item["deadline"]
        days_left = (dl - today).days
        icon = "🔴" if item["urgency"] == "CRITICAL" else "🟡" if days_left <= 5 else "🟢"
        status = f"còn {days_left} ngày" if days_left >= 0 else f"QUÁ HẠN {-days_left} ngày"
        print(f"\n  {icon} {dl.strftime('%d/%m/%Y')} [{status}]")
        print(f"     {item['name']}")
        print(f"     → {item['description']}")

    if companies:
        print(f"\n  📋 Danh sách công ty cần xử lý:")
        for co in companies:
            vat = co.get("vat_period", "monthly")
            print(f"     • {co['code']} — {co['name']} (khai thuế: {vat})")

    print(f"\n{'='*65}\n")
