"""
Poe2VisualTool Keygen Tool (Admin / Master Key Generator)
Công cụ sinh mã bản quyền thương mại cho quản trị viên và hệ thống phân phối.
Sử dụng:
  CLI:
    python tools/keygen_tool.py --hwid PVT-XXXX-XXXX-XXXX-XXXX --tier lifetime
    python tools/keygen_tool.py --hwid PVT-XXXX-XXXX-XXXX-XXXX --tier subscription --days 30
    python tools/keygen_tool.py --current-machine --tier lifetime
  GUI:
    python tools/keygen_tool.py (Khởi chạy giao diện Admin sinh key trực quan)
Bản quyền 2026 Poe2VisualTool.
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

# Đảm bảo import được module từ src
ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")
if hasattr(sys.stderr, "reconfigure"):
    sys.stderr.reconfigure(encoding="utf-8", errors="replace")

from src.commercial.hwid import get_machine_hwid
from src.commercial.license_manager import LicenseManager, LicenseTier


def run_cli(args: argparse.Namespace) -> int:
    target_hwid = args.hwid
    if args.current_machine:
        target_hwid = get_machine_hwid()
        print(f"[*] HWID máy tính hiện tại: {target_hwid}")

    if not target_hwid:
        print("[!] Lỗi: Vui lòng cung cấp --hwid <MÃ_HWID> hoặc dùng --current-machine")
        return 1

    tier_str = args.tier.upper()
    days = args.days
    if tier_str in ("LIFETIME", "VINH_VIEN", "LIFE"):
        tier = LicenseTier.LIFETIME
        tier_label = "VĨNH VIỄN (Lifetime)"
    elif tier_str in ("TRIAL", "DUNG_THU"):
        tier = LicenseTier.TRIAL
        days = days if days > 0 else 1
        tier_label = f"DÙNG THỬ ({days} ngày)"
    else:
        tier = LicenseTier.SUBSCRIPTION
        days = days if days > 0 else 30
        tier_label = f"THUÊ BAO ({days} ngày)"

    key = LicenseManager.generate_product_key(
        target_hwid=target_hwid,
        tier=tier,
        duration_days=days,
    )

    print("\n" + "=" * 64)
    print("  POE2VISUALTOOL COMMERCIAL KEYGEN (BẢN QUYỀN 2026)")
    print("=" * 64)
    print(f"  • Mục tiêu HWID : {target_hwid}")
    print(f"  • Gói bản quyền : {tier_label}")
    print(f"  • Product Key   : {key}")
    print("=" * 64)
    print("  -> Hãy sao chép Product Key trên gửi cho khách hàng.\n")
    return 0


def run_gui():
    """Giao diện đồ họa tiện lợi cho Admin sinh key nhanh."""
    import customtkinter as ctk

    ctk.set_appearance_mode("dark")
    ctk.set_default_color_theme("blue")

    root = ctk.CTk()
    root.title("Poe2VisualTool — Admin Key Generator (2026)")
    root.geometry("620x460")
    root.resizable(False, False)

    lbl_title = ctk.CTkLabel(
        root,
        text="🔑 Poe2VisualTool Master Keygen",
        font=ctk.CTkFont(size=18, weight="bold"),
        text_color="#38bdf8",
    )
    lbl_title.pack(pady=(20, 10))

    frame = ctk.CTkFrame(root, corner_radius=10)
    frame.pack(fill="both", expand=True, padx=25, pady=(0, 20))

    # 1. HWID input
    ctk.CTkLabel(frame, text="Mã phần cứng khách hàng (HWID):", font=ctk.CTkFont(size=12, weight="bold")).pack(anchor="w", padx=20, pady=(15, 2))
    
    hwid_row = ctk.CTkFrame(frame, fg_color="transparent")
    hwid_row.pack(fill="x", padx=20, pady=(0, 10))

    entry_hwid = ctk.CTkEntry(hwid_row, placeholder_text="PVT-XXXX-XXXX-XXXX-XXXX", font=ctk.CTkFont(family="Consolas", size=13))
    entry_hwid.pack(side="left", fill="x", expand=True, padx=(0, 8))

    def on_paste_hwid():
        try:
            val = root.clipboard_get().strip()
            entry_hwid.delete(0, "end")
            entry_hwid.insert(0, val)
        except Exception:
            pass

    btn_paste = ctk.CTkButton(hwid_row, text="📋 Dán", width=60, command=on_paste_hwid)
    btn_paste.pack(side="left", padx=(0, 4))

    def on_my_hwid():
        entry_hwid.delete(0, "end")
        entry_hwid.insert(0, get_machine_hwid())

    btn_my_hwid = ctk.CTkButton(hwid_row, text="💻 Máy này", width=80, fg_color="#475569", hover_color="#334155", command=on_my_hwid)
    btn_my_hwid.pack(side="left")

    # 2. Tier Selection
    ctk.CTkLabel(frame, text="Gói bản quyền cấp phép:", font=ctk.CTkFont(size=12, weight="bold")).pack(anchor="w", padx=20, pady=(5, 2))

    cbo_tier = ctk.CTkComboBox(
        frame,
        values=[
            "Vĩnh Viễn (Lifetime)",
            "Thuê bao 30 Ngày (1 Tháng)",
            "Thuê bao 90 Ngày (3 Tháng / Season League)",
            "Thuê bao 365 Ngày (1 Năm)",
            "Dùng thử 24 Giờ (Free Trial)",
        ],
        width=360,
    )
    cbo_tier.set("Vĩnh Viễn (Lifetime)")
    cbo_tier.pack(anchor="w", padx=20, pady=(0, 15))

    # 3. Output Key
    ctk.CTkLabel(frame, text="Product Key đã sinh:", font=ctk.CTkFont(size=12, weight="bold")).pack(anchor="w", padx=20, pady=(5, 2))

    entry_key = ctk.CTkEntry(
        frame,
        placeholder_text="PVTK-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX",
        font=ctk.CTkFont(family="Consolas", size=13, weight="bold"),
        text_color="#22c55e",
    )
    entry_key.pack(fill="x", padx=20, pady=(0, 15))

    lbl_status = ctk.CTkLabel(frame, text="", font=ctk.CTkFont(size=11), text_color="#94a3b8")
    lbl_status.pack(pady=(0, 10))

    # 4. Buttons
    btn_row = ctk.CTkFrame(frame, fg_color="transparent")
    btn_row.pack(pady=(0, 10))

    def on_generate():
        hwid = entry_hwid.get().strip()
        if not hwid:
            lbl_status.configure(text="[!] Lỗi: Chưa nhập HWID khách hàng!", text_color="#ef4444")
            return

        choice = cbo_tier.get()
        if "Vĩnh Viễn" in choice:
            tier = LicenseTier.LIFETIME
            days = 0
        elif "30 Ngày" in choice:
            tier = LicenseTier.SUBSCRIPTION
            days = 30
        elif "90 Ngày" in choice:
            tier = LicenseTier.SUBSCRIPTION
            days = 90
        elif "365 Ngày" in choice:
            tier = LicenseTier.SUBSCRIPTION
            days = 365
        else:
            tier = LicenseTier.TRIAL
            days = 1

        k = LicenseManager.generate_product_key(hwid, tier, duration_days=days)
        entry_key.delete(0, "end")
        entry_key.insert(0, k)
        lbl_status.configure(text="[+] Đã sinh mã bản quyền thành công!", text_color="#22c55e")

    btn_gen = ctk.CTkButton(
        btn_row,
        text="⚡ Sinh Mã Bản Quyền",
        width=160,
        height=36,
        font=ctk.CTkFont(size=13, weight="bold"),
        fg_color="#0284c7",
        hover_color="#0369a1",
        command=on_generate,
    )
    btn_gen.pack(side="left", padx=8)

    def on_copy():
        k = entry_key.get().strip()
        if k:
            root.clipboard_clear()
            root.clipboard_append(k)
            lbl_status.configure(text="[✓] Đã sao chép Product Key vào Clipboard!", text_color="#38bdf8")

    btn_copy = ctk.CTkButton(
        btn_row,
        text="📋 Sao Chép Key",
        width=140,
        height=36,
        fg_color="#10b981",
        hover_color="#059669",
        command=on_copy,
    )
    btn_copy.pack(side="left", padx=8)

    root.mainloop()


def main():
    parser = argparse.ArgumentParser(description="Poe2VisualTool Commercial Keygen Tool")
    parser.add_argument("--hwid", type=str, help="Target HWID (PVT-XXXX-XXXX-XXXX-XXXX)")
    parser.add_argument("--current-machine", action="store_true", help="Generate for current PC")
    parser.add_argument("--tier", type=str, default="lifetime", choices=["lifetime", "subscription", "trial"])
    parser.add_argument("--days", type=int, default=30, help="Subscription duration in days")
    parser.add_argument("--cli", action="store_true", help="Force CLI mode")

    args = parser.parse_args()

    if args.hwid or args.current_machine or args.cli:
        sys.exit(run_cli(args))
    else:
        run_gui()


if __name__ == "__main__":
    main()
