import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import random

# ============================================================
# KARDS 二战卡牌对战模拟器 - 桌面应用版
# 包含：主页、详细玩法介绍、卡组构筑、模拟对战
# ============================================================

class KARDSApp:
    def __init__(self, root):
        self.root = root
        self.root.title("KARDS 二战策略卡牌 - 战术模拟器")
        self.root.geometry("1100x720")
        self.root.configure(bg="#1a1a2e")
        self.root.resizable(True, True)

        # 样式配置
        self.style = ttk.Style()
        self.style.theme_use("clam")
        self.style.configure("TFrame", background="#1a1a2e")
        self.style.configure("TLabel", background="#1a1a2e", foreground="#e0d4b4", font=("Microsoft YaHei", 11))
        self.style.configure("Title.TLabel", font=("Microsoft YaHei", 24, "bold"), foreground="#d4a853")
        self.style.configure("Subtitle.TLabel", font=("Microsoft YaHei", 14), foreground="#b8a98a")
        self.style.configure("TButton", font=("Microsoft YaHei", 12), padding=8)
        self.style.configure("Accent.TButton", font=("Microsoft YaHei", 12, "bold"), padding=8)

        # 阵营数据
        self.factions = {
            "🇩🇪 德国": {"color": "#8b0000", "style": "装甲突击、闪击快攻", "desc": "以坦克和闪击为核心，快速占领前线，用高机动单位压制对手。"},
            "🇷🇺 苏联": {"color": "#1a3a1a", "style": "钢铁洪流、人海战术", "desc": "高费重装甲单位配合亡计效果，后期碾压对手。"},
            "🇬🇧 英国": {"color": "#0a2a4a", "style": "强力守护、防守反击", "desc": "依靠守护单位构建防线，等待时机反击。"},
            "🇺🇸 美国": {"color": "#2a2a0a", "style": "空中压制、指令体系", "desc": "强大的空军和指令卡组合，控制战场节奏。"},
            "🇯🇵 日本": {"color": "#3a1a0a", "style": "激进快攻、无反制", "desc": "低费高效单位，快速铺场抢血，没有反制指令。"},
        }

        self.alliance_options = ["无盟国", "🇫🇷 法国", "🇮🇹 意大利"]

        # 卡牌数据库（简化版）
        self.card_db = self._build_card_db()

        self.current_frame = None
        self.show_home_page()

    # ==================== 页面切换 ====================
    def clear_frame(self):
        if self.current_frame:
            self.current_frame.destroy()

    def show_home_page(self):
        self.clear_frame()
        self.current_frame = tk.Frame(self.root, bg="#1a1a2e")
        self.current_frame.pack(fill="both", expand=True)

        # 顶部装饰条
        top_bar = tk.Frame(self.current_frame, bg="#d4a853", height=4)
        top_bar.pack(fill="x")

        # 主内容区
        main = tk.Frame(self.current_frame, bg="#1a1a2e")
        main.pack(fill="both", expand=True, padx=40, pady=20)

        # 标题
        tk.Label(main, text="⚔  KARDS  ⚔", font=("Microsoft YaHei", 48, "bold"),
                 fg="#d4a853", bg="#1a1a2e").pack(pady=(30, 5))
        tk.Label(main, text="二战题材策略卡牌游戏 · 战术模拟器",
                 font=("Microsoft YaHei", 16), fg="#8a9ab8", bg="#1a1a2e").pack(pady=(0, 40))

        # 按钮区
        btn_frame = tk.Frame(main, bg="#1a1a2e")
        btn_frame.pack(pady=20)

        buttons = [
            ("📖  详细玩法介绍", self.show_rules_page, "#d4a853"),
            ("🃏  卡组构筑器", self.show_deck_builder, "#4a9dd4"),
            ("⚔  模拟对战", self.show_battle_sim, "#8b3a3a"),
            ("📊  卡牌图鉴", self.show_card_dex, "#4a8b4a"),
        ]

        for text, cmd, color in buttons:
            btn = tk.Button(btn_frame, text=text, command=cmd,
                          font=("Microsoft YaHei", 14, "bold"),
                          bg=color, fg="white", activebackground="#555",
                          activeforeground="white", relief="flat",
                          padx=30, pady=12, cursor="hand2",
                          width=20)
            btn.pack(pady=10)

        # 底部信息
        tk.Label(main, text="v2.0 | 基于 KARDS 官方规则 | 单文件 Python/Tkinter",
                 font=("Microsoft YaHei", 9), fg="#555", bg="#1a1a2e").pack(side="bottom", pady=10)

    # ==================== 详细玩法介绍页 ====================
    def show_rules_page(self):
        self.clear_frame()
        self.current_frame = tk.Frame(self.root, bg="#1a1a2e")
        self.current_frame.pack(fill="both", expand=True)

        # 顶部导航
        nav = tk.Frame(self.current_frame, bg="#0d0d1a", height=50)
        nav.pack(fill="x")
        tk.Button(nav, text="◀ 返回主页", command=self.show_home_page,
                  font=("Microsoft YaHei", 10), bg="#0d0d1a", fg="#d4a853",
                  relief="flat", cursor="hand2").pack(side="left", padx=15, pady=10)
        tk.Label(nav, text="详细玩法介绍", font=("Microsoft YaHei", 14, "bold"),
                 fg="#d4a853", bg="#0d0d1a").pack(side="left", pady=10)

        # 内容区
        content = scrolledtext.ScrolledText(self.current_frame, wrap=tk.WORD,
                                             font=("Microsoft YaHei", 11),
                                             bg="#0f0f23", fg="#d0d0d0",
                                             insertbackground="white",
                                             padx=20, pady=15, relief="flat")
        content.pack(fill="both", expand=True, padx=20, pady=10)

        rules_text = """
╔══════════════════════════════════════════════════════════════╗
    KARDS 二战策略卡牌 — 完整规则手册
╚══════════════════════════════════════════════════════════════╝

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🎯 一、胜利条件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  • 将敌方总部防御点数降至 0 或以下即获胜（总部初始 20 点）
  • 总部血量归零时，即使该回合你也要输，也判定为平局
  • 疲劳伤害：卡组抽空后，每次抽牌对总部造成伤害
    伤害值从 1 开始，每回合 +1（1→2→3→4...）

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🗺️ 二、三线战场布局
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐
  │  敌方支援    │  │    前线      │  │  己方支援    │
  │   阵线       │  │  (争夺区)    │  │   阵线       │
  │              │  │              │  │              │
  │  ●敌方总部   │  │  ●前线单位   │  │  ●己方总部   │
  │  ●敌方单位   │  │  (最多5张)   │  │  ●己方单位   │
  └─────────────┘  └─────────────┘  └─────────────┘

  • 己方支援阵线：总部所在地，部署单位在此
  • 前线：双方争夺核心，同一时间只能一方控制，最多5张卡
  • 敌方支援阵线：敌方总部所在
  • 步兵/坦克必须进入前线才能攻击敌方支援阵线目标
  • 敌方单位不可移动至你的支援阵线

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  💰 三、指挥点资源系统
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  • 每回合指挥点槽 +1，上限 12（最高可达 24 槽）
  • 回合开始时获得等同于槽数的指挥点
  • 三项消耗：部署单位、使用指令、激活单位移动/攻击

  ⚠️ 核心设计：每张单位卡有"双费用"
     • 部署费用（大数字）：打出卡牌的花费
     • 行动费用（小数字）：每次移动/攻击的花费
     例：四号坦克G型 部署5费 + 行动2费
     若一回合移动+攻击，共耗 4 费指挥点

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🃏 四、卡牌类型与兵种
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  【单位卡】5大类型：

  类型       攻击范围      特殊规则
  ─────────────────────────────────────────────
  步兵       仅相邻战线    基础陆战单位，费用/身材比最标准
  坦克       仅相邻战线    可同回合移动+攻击；遇空军被动挨打
  火炮       任意战线      无视守护、不受反击伤害，但数值亏身材
  战斗机     任意战线      可拦截轰炸机、攻击敌方战斗机
  轰炸机     任意战线      无视守护、不受反击（被战斗机打除外）

  ⚙️ 兵种克制闭环：
     坦克怕飞机 → 飞机怕火炮 → 火炮怕步兵占线

  【指令卡】一次性生效后弃置
  【反制指令】隐藏在手中，满足条件自动触发

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  📋 五、关键词条系统
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  闪击(Blitz)    部署当回合即可行动；坦克可同回合移动+攻击
  守护(Guard)    相邻非守护单位/总部只能被火炮和轰炸机攻击
  烟幕(Smokescreen) 移动/攻击前无法被敌方单位攻击
  伏击(Ambush)   每回合首次被攻击时先造成反击，击杀攻击者则自身无伤
  奋战(Fury)     每回合可攻击两次
  重甲(Heavy Armor X) 受单位伤害 -X（最高3），不减免指令伤害
  冲击(Shock)    首次攻击不受反击、无视伏击
  亡计           单位死亡时触发效果

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  📦 六、卡组构筑规则
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  • 卡组共 40 张卡牌
  • 选择 1 个主阵营 + 1 个盟国
  • 主阵营 28 张 + 盟国 12 张
  • 盟国可选：法国、意大利（仅可作盟国）
  • 主阵营：德国、苏联、英国、美国、日本

  各阵营特色：
  🇩🇪 德国 — 装甲突击、闪击快攻
  🇷🇺 苏联 — 高费钢铁洪流、人海战术、亡计
  🇬🇧 英国 — 强力守护防守、海陆协同
  🇺🇸 美国 — 空中压制、指令体系
  🇯🇵 日本 — 无反制，激进快攻

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🔄 七、对局流程
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  1. 回合开始：抽1张牌 → 指挥点槽+1 → 指挥点回满
  2. 行动阶段：部署、使用指令、移动/攻击（无顺序限制）
  3. 结束阶段：处理回合结束效果 → 轮到对手
  4. 手牌上限 9 张，超出自动弃掉

  起手调度：
  • 先手 4 张（首回合不抽牌）
  • 后手 5 张（首回合抽1张）
  • 开局可一次性替换起始卡牌

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  📊 八、身材基准与费用曲线
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  合模公式：攻 + 防 ≈ 部署费用 × 2 + 2

  费用  标准身材  攻防总和
  1费   1/2或2/1    3
  2费   2/3或3/2    5
  3费   3/4或4/3    7
  4费   4/5或5/4    9
  5费   5/6或6/5   11
  6费   6/7或7/6   13
  7费   7/8或8/7   15
  8费   8/9或9/8   17

  费用曲线建议：
  • 快攻：1-2费 ~50%，3-4费 ~35%，5+费 ~15%
  • 中速：1-2费 ~35%，3-4费 ~40%，5+费 ~25%
  • 控制：1-2费 ~20%，3-4费 ~40%，5+费 ~40%

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🎮 九、进阶机制
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  • 撤退：前线单位撤退回己方支援阵线；支援阵线满则回手牌
  • 溢出伤害：攻击总伤害 − 防守方防御力 = 溢出值
  • 卡牌轮换：新扩展包上线后部分旧卡退出标准模式

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🏆 十、游戏模式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  • 训练（vs AI）：对战不同卡组的AI
  • 对战（PVP）：天梯排位，胜利得星
  • 竞技场：入场费150金币或20钻石，7胜或3负结束

╔══════════════════════════════════════════════════════════════╗
  设计启示：KARDS 的成功证明——题材不是"皮"，而是玩法创新的源泉
  用"前线争夺 + 兵种克制 + 双费用资源"三板斧，构建出同类游戏中最
  具策略纵深的战场体验。
╚══════════════════════════════════════════════════════════════╝
        """

        content.insert("1.0", rules_text)
        content.config(state="disabled")

    # ==================== 卡组构筑器 ====================
    def show_deck_builder(self):
        self.clear_frame()
        self.current_frame = tk.Frame(self.root, bg="#1a1a2e")
        self.current_frame.pack(fill="both", expand=True)

        # 导航
        nav = tk.Frame(self.current_frame, bg="#0d0d1a", height=50)
        nav.pack(fill="x")
        tk.Button(nav, text="◀ 返回主页", command=self.show_home_page,
                  font=("Microsoft YaHei", 10), bg="#0d0d1a", fg="#d4a853",
                  relief="flat", cursor="hand2").pack(side="left", padx=15, pady=10)
        tk.Label(nav, text="卡组构筑器", font=("Microsoft YaHei", 14, "bold"),
                 fg="#d4a853", bg="#0d0d1a").pack(side="left", pady=10)

        # 主体
        body = tk.Frame(self.current_frame, bg="#1a1a2e")
        body.pack(fill="both", expand=True, padx=30, pady=15)

        # 左侧：选择区
        left = tk.LabelFrame(body, text=" 阵营选择 ", font=("Microsoft YaHei", 12, "bold"),
                              fg="#d4a853", bg="#1a1a2e", bd=2, relief="groove")
        left.pack(side="left", fill="y", padx=(0, 15), ipadx=10, ipady=10)

        tk.Label(left, text="主阵营：", font=("Microsoft YaHei", 11, "bold"),
                 fg="#e0d4b4", bg="#1a1a2e").pack(anchor="w", pady=(10, 5))

        self.main_faction_var = tk.StringVar(value="🇩🇪 德国")
        for name in self.factions.keys():
            tk.Radiobutton(left, text=name, variable=self.main_faction_var, value=name,
                          font=("Microsoft YaHei", 10), fg="#b8a98a", bg="#1a1a2e",
                          selectcolor="#2a2a4a", activebackground="#1a1a2e",
                          activeforeground="#d4a853", cursor="hand2",
                          command=self._update_deck_preview).pack(anchor="w", padx=10)

        tk.Label(left, text="\n盟国：", font=("Microsoft YaHei", 11, "bold"),
                 fg="#e0d4b4", bg="#1a1a2e").pack(anchor="w", pady=(15, 5))

        self.alliance_var = tk.StringVar(value="无盟国")
        for name in self.alliance_options:
            tk.Radiobutton(left, text=name, variable=self.alliance_var, value=name,
                          font=("Microsoft YaHei", 10), fg="#b8a98a", bg="#1a1a2e",
                          selectcolor="#2a2a4a", activebackground="#1a1a2e",
                          activeforeground="#d4a853", cursor="hand2",
                          command=self._update_deck_preview).pack(anchor="w", padx=10)

        # 生成按钮
        tk.Button(left, text="🎲 随机生成卡组", command=self._generate_deck,
                  font=("Microsoft YaHei", 11, "bold"), bg="#d4a853", fg="#1a1a2e",
                  relief="flat", padx=15, pady=8, cursor="hand2").pack(pady=20)

        # 右侧：预览区
        right = tk.LabelFrame(body, text=" 卡组预览 ", font=("Microsoft YaHei", 12, "bold"),
                               fg="#d4a853", bg="#1a1a2e", bd=2, relief="groove")
        right.pack(side="right", fill="both", expand=True, ipadx=10, ipady=10)

        # 统计信息
        self.deck_stats_label = tk.Label(right, text="", font=("Microsoft YaHei", 10),
                                          fg="#8a9ab8", bg="#1a1a2e", justify="left")
        self.deck_stats_label.pack(anchor="w", padx=10, pady=(10, 5))

        # 卡牌列表
        list_frame = tk.Frame(right, bg="#0f0f23", relief="sunken", bd=1)
        list_frame.pack(fill="both", expand=True, padx=10, pady=10)

        self.deck_listbox = tk.Listbox(list_frame, font=("Consolas", 10),
                                        bg="#0f0f23", fg="#d0d0d0",
                                        selectbackground="#d4a853", selectforeground="#1a1a2e",
                                        relief="flat", highlightthickness=0)
        scrollbar = tk.Scrollbar(list_frame, orient="vertical", command=self.deck_listbox.yview)
        self.deck_listbox.config(yscrollcommand=scrollbar.set)
        self.deck_listbox.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

        # 曲线图（文本形式）
        self.curve_label = tk.Label(right, text="", font=("Consolas", 9),
                                     fg="#4a9dd4", bg="#1a1a2e", justify="left")
        self.curve_label.pack(anchor="w", padx=10, pady=(0, 10))

        self._update_deck_preview()

    def _build_card_db(self):
        """构建简化卡牌数据库"""
        cards = []
        # 德国卡牌
        german = [
            ("一号坦克", 1, 1, 1, "坦克", "闪击"),
            ("二号坦克", 2, 2, 1, "坦克", "闪击"),
            ("三号坦克", 3, 3, 2, "坦克", "闪击"),
            ("四号坦克A", 4, 4, 2, "坦克", "闪击"),
            ("四号坦克G", 5, 5, 2, "坦克", "闪击"),
            ("虎式坦克", 7, 7, 3, "坦克", "重甲2,闪击"),
            ("虎王坦克", 9, 9, 4, "坦克", "重甲3,闪击"),
            ("步兵班", 2, 2, 3, "步兵", ""),
            ("掷弹兵", 3, 3, 4, "步兵", ""),
            ("突击工兵", 4, 4, 4, "步兵", "奋战"),
            ("88mm高炮", 5, 3, 6, "火炮", "防空"),
            ("斯图卡", 4, 4, 3, "轰炸机", ""),
            ("Bf-109", 3, 3, 3, "战斗机", ""),
            ("FW-190", 4, 4, 4, "战斗机", ""),
            ("闪电战", 0, 0, 0, "指令", "本回合单位行动费-1"),
            ("烟幕掩护", 0, 0, 0, "指令", "单位获得烟幕"),
        ]
        for c in german:
            cards.append({"name": c[0], "cost": c[1], "atk": c[2], "def": c[3],
                         "type": c[4], "kw": c[5], "faction": "德国"})

        # 苏联卡牌
        soviet = [
            ("步兵排", 2, 2, 4, "步兵", ""),
            ("近卫步兵", 3, 3, 5, "步兵", "守护"),
            ("T-26坦克", 3, 3, 2, "坦克", ""),
            ("T-34/76", 5, 5, 4, "坦克", "闪击"),
            ("T-34/85", 6, 6, 4, "坦克", "闪击"),
            ("KV-1", 6, 5, 6, "坦克", "重甲2"),
            ("IS-2", 8, 8, 6, "坦克", "重甲2,冲击"),
            ("喀秋莎", 5, 4, 5, "火炮", ""),
            ("ZIS-3", 3, 2, 4, "火炮", ""),
            ("IL-2", 5, 5, 4, "轰炸机", ""),
            ("Yak-9", 4, 4, 4, "战斗机", ""),
            ("动员", 0, 0, 0, "指令", "抽2张，费用+1"),
            ("冬季攻势", 0, 0, 0, "指令", "所有己方单位+1+1"),
        ]
        for c in soviet:
            cards.append({"name": c[0], "cost": c[1], "atk": c[2], "def": c[3],
                         "type": c[4], "kw": c[5], "faction": "苏联"})

        # 美国卡牌
        american = [
            ("游骑兵", 3, 3, 3, "步兵", "冲击"),
            ("M4谢尔曼", 5, 5, 4, "坦克", "闪击"),
            ("M26潘兴", 7, 7, 5, "坦克", "重甲1,闪击"),
            ("M7牧师", 4, 4, 4, "火炮", ""),
            ("P-51野马", 5, 5, 5, "战斗机", ""),
            ("B-17", 7, 7, 6, "轰炸机", ""),
            ("战略轰炸", 0, 0, 0, "指令", "对敌方总部造成3伤害"),
            ("补给线", 0, 0, 0, "指令", "抽2张卡牌"),
        ]
        for c in american:
            cards.append({"name": c[0], "cost": c[1], "atk": c[2], "def": c[3],
                         "type": c[4], "kw": c[5], "faction": "美国"})

        # 英国卡牌
        british = [
            ("步兵班", 2, 2, 3, "步兵", ""),
            ("马蒂尔达", 5, 4, 5, "坦克", "重甲1"),
            ("丘吉尔", 7, 6, 7, "坦克", "重甲2"),
            ("QF25磅炮", 4, 3, 5, "火炮", ""),
            ("喷火", 4, 4, 4, "战斗机", ""),
            ("兰开斯特", 6, 6, 5, "轰炸机", ""),
            ("坚守阵地", 0, 0, 0, "指令", "所有己方单位获得守护"),
        ]
        for c in british:
            cards.append({"name": c[0], "cost": c[1], "atk": c[2], "def": c[3],
                         "type": c[4], "kw": c[5], "faction": "英国"})

        # 日本卡牌
        japanese = [
            ("步兵班", 1, 2, 2, "步兵", ""),
            ("零式战机", 3, 3, 3, "战斗机", ""),
            ("神风特攻", 0, 0, 0, "指令", "单位攻击后死亡，对目标额外造成3伤害"),
            ("97式坦克", 3, 3, 2, "坦克", ""),
            ("武士精神", 0, 0, 0, "指令", "单位+2+2"),
        ]
        for c in japanese:
            cards.append({"name": c[0], "cost": c[1], "atk": c[2], "def": c[3],
                         "type": c[4], "kw": c[5], "faction": "日本"})

        return cards

    def _update_deck_preview(self):
        """更新卡组预览"""
        main_faction = self.main_faction_var.get().replace("🇩🇪 ", "").replace("🇷🇺 ", "").replace("🇬🇧 ", "").replace("🇺🇸 ", "").replace("🇯🇵 ", "")
        alliance = self.alliance_var.get()

        # 筛选卡牌
        main_cards = [c for c in self.card_db if c["faction"] == main_faction]
        if alliance != "无盟国":
            ally_name = alliance.replace("🇫🇷 ", "").replace("🇮🇹 ", "")
            ally_cards = [c for c in self.card_db if c["faction"] == ally_name]
        else:
            ally_cards = []

        # 统计
        total_main = min(28, len(main_cards))
        total_ally = min(12, len(ally_cards))

        stats = f"主国({main_faction})：{total_main}张 | 盟国({alliance})：{total_ally}张 | 总计：{total_main + total_ally}张"
        self.deck_stats_label.config(text=stats)

        # 填充列表
        self.deck_listbox.delete(0, tk.END)

        # 主国卡
        self.deck_listbox.insert(tk.END, f"═══ {main_faction} ({total_main}张) ═══")
        for i, c in enumerate(main_cards[:total_main]):
            icon = {"步兵": "🚶", "坦克": "🚗", "火炮": "💣", "战斗机": "✈️", "轰炸机": "🛩️", "指令": "📜"}.get(c["type"], "❓")
            line = f"  {icon} {c['name']:>12} | {c['cost']}费 | {c['atk']}/{c['def']} | {c['type']} | {c['kw']}"
            self.deck_listbox.insert(tk.END, line)

        # 盟国卡
        if ally_cards:
            self.deck_listbox.insert(tk.END, f"\n═══ {alliance} ({total_ally}张) ═══")
            for c in ally_cards[:total_ally]:
                icon = {"步兵": "🚶", "坦克": "🚗", "火炮": "💣", "战斗机": "✈️", "轰炸机": "🛩️", "指令": "📜"}.get(c["type"], "❓")
                line = f"  {icon} {c['name']:>12} | {c['cost']}费 | {c['atk']}/{c['def']} | {c['type']} | {c['kw']}"
                self.deck_listbox.insert(tk.END, line)

        # 费用曲线
        costs = [0]*9
        for c in main_cards[:total_main]:
            if c["cost"] < 9:
                costs[c["cost"]] += 1
        for c in ally_cards[:total_ally]:
            if c["cost"] < 9:
                costs[c["cost"]] += 1

        curve_text = "费用曲线：\n"
        for i in range(9):
            bar = "█" * costs[i]
            curve_text += f"  {i}费: {bar} ({costs[i]})\n"

        self.curve_label.config(text=curve_text)

    def _generate_deck(self):
        """随机生成卡组"""
        factions = list(self.factions.keys())
        main = random.choice(factions)
        self.main_faction_var.set(main)

        ally = random.choice(self.alliance_options)
        self.alliance_var.set(ally)

        self._update_deck_preview()

        messagebox.showinfo("生成完成", f"已生成 {main} + {ally} 的随机卡组！")

    # ==================== 模拟对战 ====================
    def show_battle_sim(self):
        self.clear_frame()
        self.current_frame = tk.Frame(self.root, bg="#1a1a2e")
        self.current_frame.pack(fill="both", expand=True)

        # 导航
        nav = tk.Frame(self.current_frame, bg="#0d0d1a", height=50)
        nav.pack(fill="x")
        tk.Button(nav, text="◀ 返回主页", command=self.show_home_page,
                  font=("Microsoft YaHei", 10), bg="#0d0d1a", fg="#d4a853",
                  relief="flat", cursor="hand2").pack(side="left", padx=15, pady=10)
        tk.Label(nav, text="模拟对战", font=("Microsoft YaHei", 14, "bold"),
                 fg="#d4a853", bg="#0d0d1a").pack(side="left", pady=10)

        # 主体
        body = tk.Frame(self.current_frame, bg="#1a1a2e")
        body.pack(fill="both", expand=True, padx=30, pady=15)

        # 战场可视化
        battlefield = tk.LabelFrame(body, text=" 战场 ", font=("Microsoft YaHei", 12, "bold"),
                                     fg="#d4a853", bg="#1a1a2e", bd=2, relief="groove")
        battlefield.pack(fill="x", pady=(0, 10))

        # 敌方总部
        enemy_frame = tk.Frame(battlefield, bg="#1a1a2e")
        enemy_frame.pack(fill="x", pady=5)
        tk.Label(enemy_frame, text="🏰 敌方总部", font=("Microsoft YaHei", 11, "bold"),
                 fg="#ff6b6b", bg="#1a1a2e").pack(side="left", padx=20)
        self.enemy_hp_label = tk.Label(enemy_frame, text="HP: 20", font=("Microsoft YaHei", 14, "bold"),
                                        fg="#ff4444", bg="#1a1a2e")
        self.enemy_hp_label.pack(side="right", padx=20)

        # 前线
        front_frame = tk.Frame(battlefield, bg="#0f0f23", relief="ridge", bd=2, height=80)
        front_frame.pack(fill="x", padx=20, pady=5)
        tk.Label(front_frame, text="⚔ 前线 (争夺区)", font=("Microsoft YaHei", 10),
                 fg="#d4a853", bg="#0f0f23").pack(pady=25)

        # 己方总部
        ally_frame = tk.Frame(battlefield, bg="#1a1a2e")
        ally_frame.pack(fill="x", pady=5)
        tk.Label(ally_frame, text="🏰 己方总部", font=("Microsoft YaHei", 11, "bold"),
                 fg="#6bff6b", bg="#1a1a2e").pack(side="left", padx=20)
        self.ally_hp_label = tk.Label(ally_frame, text="HP: 20", font=("Microsoft YaHei", 14, "bold"),
                                       fg="#44ff44", bg="#1a1a2e")
        self.ally_hp_label.pack(side="right", padx=20)

        # 指挥点
        cp_frame = tk.Frame(body, bg="#1a1a2e")
        cp_frame.pack(fill="x", pady=5)
        self.cp_label = tk.Label(cp_frame, text="指挥点: 1/1 (上限:1)", font=("Microsoft YaHei", 12, "bold"),
                                  fg="#4a9dd4", bg="#1a1a2e")
        self.cp_label.pack()

        # 回合信息
        self.turn_label = tk.Label(body, text="第 1 回合 - 你的行动阶段", font=("Microsoft YaHei", 11),
                                    fg="#b8a98a", bg="#1a1a2e")
        self.turn_label.pack(pady=5)

        # 操作按钮
        btn_row = tk.Frame(body, bg="#1a1a2e")
        btn_row.pack(pady=10)

        tk.Button(btn_row, text="🎲 模拟一回合", command=self._simulate_turn,
                  font=("Microsoft YaHei", 11, "bold"), bg="#4a9dd4", fg="white",
                  relief="flat", padx=15, pady=8, cursor="hand2").pack(side="left", padx=5)
        tk.Button(btn_row, text="⚡ 快速对战到底", command=self._simulate_to_end,
                  font=("Microsoft YaHei", 11, "bold"), bg="#8b3a3a", fg="white",
                  relief="flat", padx=15, pady=8, cursor="hand2").pack(side="left", padx=5)
        tk.Button(btn_row, text="🔄 重置", command=self.show_battle_sim,
                  font=("Microsoft YaHei", 11), bg="#555", fg="white",
                  relief="flat", padx=15, pady=8, cursor="hand2").pack(side="left", padx=5)

        # 战斗日志
        log_frame = tk.LabelFrame(body, text=" 战斗日志 ", font=("Microsoft YaHei", 10, "bold"),
                                   fg="#8a9ab8", bg="#1a1a2e", bd=1, relief="groove")
        log_frame.pack(fill="both", expand=True, pady=(10, 0))

        self.log_text = scrolledtext.ScrolledText(log_frame, wrap=tk.WORD, height=8,
                                                  font=("Consolas", 9),
                                                  bg="#0a0a1a", fg="#a0c0a0",
                                                  relief="flat")
        self.log_text.pack(fill="both", expand=True, padx=5, pady=5)

        self.battle_state = {
            "turn": 1, "ally_hp": 20, "enemy_hp": 20,
            "cp": 1, "cp_max": 1, "log": []
        }
        self._log("🎮 对战开始！选择操作...")

    def _log(self, msg):
        self.log_text.insert(tk.END, msg + "\n")
        self.log_text.see(tk.END)
        self.battle_state["log"].append(msg)

    def _simulate_turn(self):
        state = self.battle_state
        if state["ally_hp"] <= 0 or state["enemy_hp"] <= 0:
            self._log("❌ 对战已结束，请重置")
            return

        state["turn"] += 1
        state["cp_max"] = min(12, state["cp_max"] + 1)
        state["cp"] = state["cp_max"]

        self._log(f"\n{'='*50}")
        self._log(f"📅 第 {state['turn']} 回合开始")
        self._log(f"💰 指挥点: {state['cp']}/{state['cp_max']}")

        # 模拟行动
        actions = [
            ("部署四号坦克G型(5费)到前线", lambda: self._action_deploy("四号坦克G型", 5, 5, 2)),
            ("部署步兵班(2费)到支援阵线", lambda: self._action_deploy("步兵班", 2, 2, 3)),
            ("前线坦克攻击敌方总部", lambda: self._action_attack(5)),
            ("使用指令卡: 闪电战", lambda: self._action_order("闪电战", "本回合单位行动费-1")),
            ("使用指令卡: 战略轰炸", lambda: self._action_order("战略轰炸", "对敌方总部造成3伤害")),
            ("移动步兵到前线", lambda: self._action_move()),
        ]

        # 随机选择2-3个行动
        turn_actions = random.sample(actions, random.randint(2, 3))
        for name, action_fn in turn_actions:
            if state["cp"] <= 0:
                self._log("  ⚠️ 指挥点耗尽，结束行动")
                break
            action_fn()
            self.root.update()

        self._update_battle_ui()

    def _action_deploy(self, name, cost, atk, defense):
        state = self.battle_state
        if state["cp"] >= cost:
            state["cp"] -= cost
            self._log(f"  📋 部署 [{name}] (消耗{cost}费, 剩余{state['cp']}费)")
            self._log(f"     属性: {atk}/{defense}")
        else:
            self._log(f"  ❌ 指挥点不足，无法部署 [{name}]")

    def _action_attack(self, dmg):
        state = self.battle_state
        cost = 2
        if state["cp"] >= cost:
            state["cp"] -= cost
            state["enemy_hp"] -= dmg
            self._log(f"  ⚔ 前线单位攻击敌方总部！造成 {dmg} 伤害")
            self._log(f"     敌方总部剩余: {max(0, state['enemy_hp'])} HP")
        else:
            self._log("  ❌ 指挥点不足，无法攻击")

    def _action_order(self, name, effect):
        state = self.battle_state
        cost = random.randint(0, 3)
        if state["cp"] >= cost:
            state["cp"] -= cost
            self._log(f"  📜 使用指令 [{name}] (消耗{cost}费)")
            self._log(f"     效果: {effect}")
            if "3伤害" in effect:
                state["enemy_hp"] -= 3
                self._log(f"     敌方总部受到3伤害，剩余: {max(0, state['enemy_hp'])} HP")
        else:
            self._log(f"  ❌ 指挥点不足，无法使用指令 [{name}]")

    def _action_move(self):
        state = self.battle_state
        cost = 1
        if state["cp"] >= cost:
            state["cp"] -= cost
            self._log(f"  🚶 步兵移动到前线 (消耗{cost}费)")
        else:
            self._log("  ❌ 指挥点不足，无法移动")

    def _simulate_to_end(self):
        while self.battle_state["ally_hp"] > 0 and self.battle_state["enemy_hp"] > 0 and self.battle_state["turn"] < 30:
            self._simulate_turn()
            self.root.update()
            self.root.after(500)

        state = self.battle_state
        if state["enemy_hp"] <= 0:
            self._log(f"\n🏆 胜利！第 {state['turn']} 回合摧毁敌方总部！")
        elif state["ally_hp"] <= 0:
            self._log(f"\n💀 失败！第 {state['turn']} 回合己方总部被摧毁！")
        else:
            self._log(f"\n⏱️ 达到最大回合数，平局！")

    def _update_battle_ui(self):
        state = self.battle_state
        self.enemy_hp_label.config(text=f"HP: {max(0, state['enemy_hp'])}")
        self.ally_hp_label.config(text=f"HP: {max(0, state['ally_hp'])}")
        self.cp_label.config(text=f"指挥点: {state['cp']}/{state['cp_max']} (上限:{state['cp_max']})")
        self.turn_label.config(text=f"第 {state['turn']} 回合")

        if state["enemy_hp"] <= 0 or state["ally_hp"] <= 0:
            result = "🏆 胜利！" if state["enemy_hp"] <= 0 else "💀 失败！"
            self.turn_label.config(text=f"{result} 对战结束")

    # ==================== 卡牌图鉴 ====================
    def show_card_dex(self):
        self.clear_frame()
        self.current_frame = tk.Frame(self.root, bg="#1a1a2e")
        self.current_frame.pack(fill="both", expand=True)

        # 导航
        nav = tk.Frame(self.current_frame, bg="#0d0d1a", height=50)
        nav.pack(fill="x")
        tk.Button(nav, text="◀ 返回主页", command=self.show_home_page,
                  font=("Microsoft YaHei", 10), bg="#0d0d1a", fg="#d4a853",
                  relief="flat", cursor="hand2").pack(side="left", padx=15, pady=10)
        tk.Label(nav, text="卡牌图鉴", font=("Microsoft YaHei", 14, "bold"),
                 fg="#d4a853", bg="#0d0d1a").pack(side="left", pady=10)

        # 筛选
        filter_frame = tk.Frame(self.current_frame, bg="#1a1a2e")
        filter_frame.pack(fill="x", padx=20, pady=10)

        tk.Label(filter_frame, text="筛选阵营：", font=("Microsoft YaHei", 10),
                 fg="#b8a98a", bg="#1a1a2e").pack(side="left")
        self.dex_faction_var = tk.StringVar(value="全部")
        faction_combo = ttk.Combobox(filter_frame, textvariable=self.dex_faction_var,
                                      values=["全部"] + list(self.factions.keys()),
                                      state="readonly", width=15, font=("Microsoft YaHei", 10))
        faction_combo.pack(side="left", padx=10)
        faction_combo.bind("<<ComboboxSelected>>", lambda e: self._update_dex())

        tk.Label(filter_frame, text="筛选类型：", font=("Microsoft YaHei", 10),
                 fg="#b8a98a", bg="#1a1a2e").pack(side="left", padx=(20, 5))
        self.dex_type_var = tk.StringVar(value="全部")
        type_combo = ttk.Combobox(filter_frame, textvariable=self.dex_type_var,
                                   values=["全部", "步兵", "坦克", "火炮", "战斗机", "轰炸机", "指令"],
                                   state="readonly", width=10, font=("Microsoft YaHei", 10))
        type_combo.pack(side="left", padx=10)
        type_combo.bind("<<ComboboxSelected>>", lambda e: self._update_dex())

        # 列表
        list_frame = tk.Frame(self.current_frame, bg="#0f0f23", relief="sunken", bd=2)
        list_frame.pack(fill="both", expand=True, padx=20, pady=(0, 20))

        columns = ("name", "faction", "cost", "atk", "def", "type", "kw")
        self.dex_tree = ttk.Treeview(list_frame, columns=columns, show="headings", height=20)

        self.dex_tree.heading("name", text="卡牌名称")
        self.dex_tree.heading("faction", text="阵营")
        self.dex_tree.heading("cost", text="费用")
        self.dex_tree.heading("atk", text="攻击")
        self.dex_tree.heading("def", text="防御")
        self.dex_tree.heading("type", text="类型")
        self.dex_tree.heading("kw", text="关键词")

        self.dex_tree.column("name", width=120)
        self.dex_tree.column("faction", width=80)
        self.dex_tree.column("cost", width=50)
        self.dex_tree.column("atk", width=50)
        self.dex_tree.column("def", width=50)
        self.dex_tree.column("type", width=70)
        self.dex_tree.column("kw", width=150)

        scrollbar = ttk.Scrollbar(list_frame, orient="vertical", command=self.dex_tree.yview)
        self.dex_tree.configure(yscrollcommand=scrollbar.set)

        self.dex_tree.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

        self._update_dex()

    def _update_dex(self):
        for item in self.dex_tree.get_children():
            self.dex_tree.delete(item)

        faction_filter = self.dex_faction_var.get()
        type_filter = self.dex_type_var.get()

        for c in self.card_db:
            show = True
            if faction_filter != "全部":
                f = faction_filter.replace("🇩🇪 ", "").replace("🇷🇺 ", "").replace("🇬🇧 ", "").replace("🇺🇸 ", "").replace("🇯🇵 ", "")
                if c["faction"] != f:
                    show = False
            if type_filter != "全部" and c["type"] != type_filter:
                show = False
            if show:
                self.dex_tree.insert("", "end", values=(
                    c["name"], c["faction"], c["cost"], c["atk"], c["def"], c["type"], c["kw"]
                ))


# ==================== 启动 ====================
if __name__ == "__main__":
    root = tk.Tk()
    app = KARDSApp(root)
    root.mainloop()