# ============================================================
# core/recurring.py
# Bút toán định kỳ: khấu hao TSCĐ, phân bổ CCDC, lãi vay
# ============================================================

import sqlite3
import json
from datetime import datetime
from typing import Optional
from core.db_init import get_conn
from core.journal import post_voucher


def add_recurring_template(db_path: str, name: str, voucher_type: str,
                            entries: list, frequency: str = "monthly",
                            description: str = "", notes: str = "") -> int:
    """
    Lưu mẫu bút toán định kỳ.
    frequency: 'monthly' | 'quarterly' | 'yearly'
    entries: list of {account_code, debit, credit, description}
    """
    conn = get_conn(db_path)
    c = conn.cursor()
    c.execute("""
        INSERT INTO recurring_templates
            (name, voucher_type, entries_json, frequency, description, is_active, notes, created_at)
        VALUES (?, ?, ?, ?, ?, 1, ?, datetime('now','localtime'))
    """, (name, voucher_type, json.dumps(entries, ensure_ascii=False),
          frequency, description, notes))
    rid = c.lastrowid
    conn.commit()
    conn.close()
    print(f"✅ Đã lưu mẫu định kỳ: #{rid} — {name}")
    return rid


def list_recurring_templates(db_path: str) -> list:
    """Liệt kê tất cả mẫu bút toán định kỳ."""
    conn = get_conn(db_path)
    c = conn.cursor()
    rows = c.execute("""
        SELECT id, name, voucher_type, frequency, is_active, last_run_month, last_run_year
        FROM recurring_templates
        ORDER BY id
    """).fetchall()
    cols = [d[0] for d in c.description]
    conn.close()
    result = [dict(zip(cols, r)) for r in rows]
    for r in result:
        pass  # entries_json parsed separately if needed
    return result


def run_recurring(db_path: str, year: int, month: int,
                  template_id: Optional[int] = None,
                  user: str = "system") -> list:
    """
    Chạy tất cả (hoặc 1) mẫu định kỳ cho kỳ year/month.
    Không chạy lại nếu kỳ đã được run.
    Returns: list voucher_id đã tạo.
    """
    conn = get_conn(db_path)
    c = conn.cursor()

    if template_id:
        templates = c.execute(
            "SELECT * FROM recurring_templates WHERE id=? AND is_active=1",
            (template_id,)
        ).fetchall()
    else:
        templates = c.execute(
            "SELECT * FROM recurring_templates WHERE is_active=1"
        ).fetchall()

    cols = [d[0] for d in c.description]
    conn.close()

    created = []
    for tpl in templates:
        t = dict(zip(cols, tpl))

        # Kiểm tra frequency
        if t["frequency"] == "quarterly" and month not in (3, 6, 9, 12):
            continue
        if t["frequency"] == "yearly" and month != 12:
            continue

        # Kiểm tra đã chạy chưa
        if t["last_run_year"] == year and t["last_run_month"] == month:
            print(f"  ⏭️ Bỏ qua #{t['id']} {t['name']} (đã chạy {month:02d}/{year})")
            continue

        entries = json.loads(t["entries_json"])
        desc = t["description"] or t["name"]
        voucher_date = f"{year}-{month:02d}-01"  # Ngày 1 hàng tháng

        try:
            vid = post_voucher(
                db_path,
                voucher_type=t["voucher_type"],
                voucher_date=voucher_date,
                description=f"{desc} — {month:02d}/{year}",
                entries=entries,
                notes=f"Tự động từ recurring template #{t['id']}",
            )
            # Cập nhật last_run
            conn2 = get_conn(db_path)
            conn2.execute("""
                UPDATE recurring_templates
                SET last_run_year=?, last_run_month=?, updated_at=datetime('now','localtime')
                WHERE id=?
            """, (year, month, t["id"]))
            conn2.commit()
            conn2.close()

            created.append(vid)
            print(f"  ✅ #{t['id']} {t['name']}: tạo chứng từ #{vid}")
        except Exception as e:
            print(f"  ❌ #{t['id']} {t['name']}: lỗi — {e}")

    return created


def deactivate_template(db_path: str, template_id: int) -> bool:
    """Tắt mẫu định kỳ."""
    conn = get_conn(db_path)
    c = conn.cursor()
    c.execute("UPDATE recurring_templates SET is_active=0 WHERE id=?", (template_id,))
    conn.commit()
    conn.close()
    return True


# ── Templates mẫu phổ biến ─────────────────────────────────

def add_depreciation_template(db_path: str, asset_name: str,
                              monthly_amount: float,
                              acc_depreciation: str = "214",
                              acc_expense: str = "6274") -> int:
    """Khấu hao tài sản cố định hàng tháng."""
    entries = [
        {"account_code": acc_expense,     "debit": monthly_amount, "credit": 0,
         "description": f"Khấu hao {asset_name}"},
        {"account_code": acc_depreciation, "debit": 0, "credit": monthly_amount,
         "description": f"Khấu hao {asset_name}"},
    ]
    return add_recurring_template(
        db_path, f"Khấu hao {asset_name}", "PB", entries,
        frequency="monthly",
        description=f"Trích khấu hao TSCĐ: {asset_name}",
    )


def add_prepaid_allocation_template(db_path: str, item_name: str,
                                    monthly_amount: float,
                                    acc_prepaid: str = "142",
                                    acc_expense: str = "642") -> int:
    """Phân bổ chi phí trả trước / CCDC."""
    entries = [
        {"account_code": acc_expense, "debit": monthly_amount, "credit": 0,
         "description": f"Phân bổ {item_name}"},
        {"account_code": acc_prepaid, "debit": 0, "credit": monthly_amount,
         "description": f"Phân bổ {item_name}"},
    ]
    return add_recurring_template(
        db_path, f"Phân bổ {item_name}", "PB", entries,
        frequency="monthly",
        description=f"Phân bổ chi phí trả trước: {item_name}",
    )
