# -*- coding: utf-8 -*-
"""
新四军历史学习助手 - 图形界面版
使用Tkinter实现交互式学习体验
"""

import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import random
from typing import List, Dict, Tuple

# ---------- 数据模块 ----------
QUIZ_DATA: List[Dict] = [
    {
        "question": "新四军正式成立于哪一年？",
        "options": ["1935年", "1937年", "1938年", "1940年"],
        "answer": 1,
        "explanation": "1937年10月，南方八省红军游击队改编为国民革命军陆军新编第四军，简称新四军。"
    },
    {
        "question": "新四军首任军长是谁？",
        "options": ["叶挺", "项英", "陈毅", "刘少奇"],
        "answer": 0,
        "explanation": "叶挺将军担任新四军首任军长，项英任副军长。"
    },
    {
        "question": "新四军在抗日战争中著名的战斗'黄桥决战'发生在哪一年？",
        "options": ["1938年", "1939年", "1940年", "1941年"],
        "answer": 2,
        "explanation": "1940年10月，新四军在江苏黄桥地区击败国民党顽固派军队，巩固了苏北抗日根据地。"
    },
    {
        "question": "皖南事变后，新四军重建军部，代军长是谁？",
        "options": ["陈毅", "张云逸", "刘少奇", "粟裕"],
        "answer": 0,
        "explanation": "1941年1月皖南事变后，中共中央重建新四军军部，任命陈毅为代军长，刘少奇为政委。"
    },
    {
        "question": "新四军坚持的游击战术方针'十六字诀'是由谁提出的？",
        "options": ["毛泽东", "朱德", "叶挺", "项英"],
        "answer": 0,
        "explanation": "毛泽东提出的'敌进我退，敌驻我扰，敌疲我打，敌退我追'十六字诀，是新四军游击战的重要指导原则。"
    },
    {
        "question": "新四军在哪个省份成立了第一个抗日根据地？",
        "options": ["江西", "安徽", "江苏", "浙江"],
        "answer": 1,
        "explanation": "1938年4月，新四军在安徽南部建立了皖南抗日根据地，这是新四军创建的第一个抗日根据地。"
    },
    {
        "question": "新四军'铁军'称号的由来与哪次战役密切相关？",
        "options": ["平型关战役", "黄桥战役", "车桥战役", "百团大战"],
        "answer": 1,
        "explanation": "黄桥决战中，新四军以少胜多，展现了顽强的战斗意志和过硬的军事素质，'铁军'称号由此更加响亮。"
    }
]

TIMELINE: List[Tuple[str, str]] = [
    ("1937年10月", "南方八省红军游击队改编为新四军"),
    ("1938年1月", "新四军军部在南昌正式成立"),
    ("1938年4月", "皖南抗日根据地创建"),
    ("1939年2月", "周恩来视察新四军，提出'向南巩固、向东作战、向北发展'方针"),
    ("1940年10月", "黄桥决战胜利，巩固苏北根据地"),
    ("1941年1月", "皖南事变爆发，新四军重建军部"),
    ("1941年-1945年", "新四军在华中地区开展大规模抗日游击战争"),
    ("1945年8月", "新四军参加抗日战争全面反攻"),
    ("1947年1月", "新四军番号撤销，改编为华东野战军")
]

HEROES: List[Dict] = [
    {"name": "叶挺", "title": "新四军首任军长", "desc": "北伐名将，抗日英雄。领导新四军开辟华中抗日根据地，被誉为'北伐铁军'之魂。"},
    {"name": "项英", "title": "新四军副军长", "desc": "杰出的工人运动领袖，新四军主要创建人之一，为南方游击战争作出重大贡献。"},
    {"name": "陈毅", "title": "新四军代军长", "desc": "无产阶级革命家、军事家。皖南事变后临危受命，重建新四军，领导华中抗战。"},
    {"name": "粟裕", "title": "新四军第一师师长", "desc": "卓越的军事家，指挥黄桥决战、车桥战役等，以灵活战术著称，战功卓著。"},
    {"name": "刘少奇", "title": "新四军政委", "desc": "皖南事变后任新四军政委，加强部队政治工作与根据地建设，巩固华中抗日根据地。"},
    {"name": "张云逸", "title": "新四军副军长", "desc": "资深革命家，协助陈毅重建新四军，为华中抗战和根据地建设作出重要贡献。"},
    {"name": "罗炳辉", "title": "新四军第二师师长", "desc": "著名军事将领，以'梅花桩战术'闻名，率部在淮南地区开展抗日斗争，屡建战功。"}
]

# ---------- 主应用程序 ----------

class NewFourthArmyApp:
    """新四军历史学习助手 - 图形界面主类"""
    
    def __init__(self, root):
        self.root = root
        self.root.title("新四军历史学习助手")
        self.root.geometry("820x650")
        self.root.resizable(True, True)
        
        # 设置窗口图标和样式
        self.root.configure(bg='#f0f0f0')
        
        # 主框架
        self.main_frame = ttk.Frame(root, padding="15")
        self.main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 顶部标题
        self.create_title()
        
        # 创建笔记本（选项卡）
        self.notebook = ttk.Notebook(self.main_frame)
        self.notebook.pack(fill=tk.BOTH, expand=True, pady=10)
        
        # 三个选项卡
        self.create_quiz_tab()
        self.create_timeline_tab()
        self.create_heroes_tab()
        
        # 底部状态栏
        self.create_statusbar()
        
    def create_title(self):
        """创建顶部标题"""
        title_frame = tk.Frame(self.main_frame, bg='#8B0000', height=60)
        title_frame.pack(fill=tk.X, pady=(0, 10))
        title_frame.pack_propagate(False)
        
        title_label = tk.Label(
            title_frame,
            text="★ 新四军历史学习 ★",
            font=('微软雅黑', 20, 'bold'),
            fg='white',
            bg='#8B0000'
        )
        title_label.pack(expand=True)
        
        subtitle = tk.Label(
            title_frame,
            text="铭记历史 · 缅怀先烈 · 传承精神",
            font=('微软雅黑', 10),
            fg='#FFD700',
            bg='#8B0000'
        )
        subtitle.pack()

    def create_statusbar(self):
        """创建底部状态栏"""
        status = tk.Label(
            self.root,
            text="🇨🇳 铁军精神，永放光芒！",
            font=('微软雅黑', 9),
            bg='#e0e0e0',
            relief=tk.SUNKEN,
            anchor=tk.W,
            padx=10
        )
        status.pack(side=tk.BOTTOM, fill=tk.X)

    # ---------- 选项卡1：知识闯关 ----------
    def create_quiz_tab(self):
        """创建知识闯关选项卡"""
        tab = ttk.Frame(self.notebook, padding=15)
        self.notebook.add(tab, text="📚 知识闯关")
        
        # 顶部控制区
        control_frame = tk.Frame(tab, bg='#f0f0f0')
        control_frame.pack(fill=tk.X, pady=(0, 10))
        
        tk.Label(
            control_frame,
            text="新四军历史知识问答",
            font=('微软雅黑', 14, 'bold'),
            fg='#8B0000'
        ).pack(side=tk.LEFT)
        
        self.quiz_btn = tk.Button(
            control_frame,
            text="🎯 开始闯关",
            font=('微软雅黑', 11, 'bold'),
            bg='#8B0000',
            fg='white',
            padx=20,
            pady=5,
            cursor='hand2',
            command=self.start_quiz
        )
        self.quiz_btn.pack(side=tk.RIGHT)
        
        # 计分板
        self.score_frame = tk.Frame(tab, bg='#fff8e7', relief=tk.RIDGE, bd=2)
        self.score_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.score_label = tk.Label(
            self.score_frame,
            text="得分：0 / 0   |   进度：未开始",
            font=('微软雅黑', 11),
            bg='#fff8e7',
            pady=5
        )
        self.score_label.pack()
        
        # 题目显示区
        self.question_frame = tk.Frame(tab, bg='white', relief=tk.RIDGE, bd=2)
        self.question_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
        
        self.question_text = tk.Text(
            self.question_frame,
            font=('微软雅黑', 12),
            wrap=tk.WORD,
            bg='white',
            relief=tk.FLAT,
            height=4,
            padx=15,
            pady=15
        )
        self.question_text.pack(fill=tk.BOTH, expand=True)
        self.question_text.insert(tk.END, "点击「开始闯关」按钮，挑战新四军历史知识！")
        self.question_text.config(state=tk.DISABLED)
        
        # 选项按钮区
        self.options_frame = tk.Frame(tab, bg='#f0f0f0')
        self.options_frame.pack(fill=tk.X, pady=5)
        
        self.option_btns = []
        for i in range(4):
            btn = tk.Button(
                self.options_frame,
                text=f"{chr(65+i)}. 选项",
                font=('微软雅黑', 10),
                bg='#e8e8e8',
                relief=tk.RAISED,
                padx=10,
                pady=8,
                cursor='hand2',
                state=tk.DISABLED,
                command=lambda idx=i: self.check_answer(idx)
            )
            btn.pack(fill=tk.X, pady=2)
            self.option_btns.append(btn)
        
        # 解析显示区
        self.explain_frame = tk.Frame(tab, bg='#e8f4f8', relief=tk.RIDGE, bd=2)
        self.explain_frame.pack(fill=tk.BOTH, expand=True, pady=(10, 0))
        
        self.explain_text = tk.Text(
            self.explain_frame,
            font=('微软雅黑', 10),
            wrap=tk.WORD,
            bg='#e8f4f8',
            relief=tk.FLAT,
            height=3,
            padx=15,
            pady=10
        )
        self.explain_text.pack(fill=tk.BOTH, expand=True)
        self.explain_text.insert(tk.END, "💡 选择答案后将显示详细解析。")
        self.explain_text.config(state=tk.DISABLED)
        
        # 存储状态
        self.quiz_questions = []
        self.current_question = 0
        self.quiz_score = 0
        self.quiz_total = 0
        self.is_quiz_active = False

    def start_quiz(self):
        """开始新的闯关"""
        self.quiz_questions = QUIZ_DATA[:]
        random.shuffle(self.quiz_questions)
        self.current_question = 0
        self.quiz_score = 0
        self.quiz_total = len(self.quiz_questions)
        self.is_quiz_active = True
        
        self.quiz_btn.config(text="🔄 重新闯关", bg='#006400')
        self.show_question()

    def show_question(self):
        """显示当前题目"""
        if self.current_question >= self.quiz_total:
            self.finish_quiz()
            return
        
        q = self.quiz_questions[self.current_question]
        
        # 更新计分板
        self.score_label.config(
            text=f"得分：{self.quiz_score} / {self.quiz_total}   |   进度：{self.current_question + 1} / {self.quiz_total}"
        )
        
        # 显示题目
        self.question_text.config(state=tk.NORMAL)
        self.question_text.delete(1.0, tk.END)
        self.question_text.insert(tk.END, f"第 {self.current_question + 1} 题：{q['question']}")
        self.question_text.config(state=tk.DISABLED)
        
        # 显示选项
        for i, opt in enumerate(q['options']):
            self.option_btns[i].config(
                text=f"{chr(65+i)}. {opt}",
                state=tk.NORMAL,
                bg='#e8e8e8'
            )
        
        # 清理解析区
        self.explain_text.config(state=tk.NORMAL)
        self.explain_text.delete(1.0, tk.END)
        self.explain_text.insert(tk.END, "💡 请选择一个选项...")
        self.explain_text.config(state=tk.DISABLED)

    def check_answer(self, idx):
        """检查用户选择的答案"""
        if not self.is_quiz_active:
            return
        
        q = self.quiz_questions[self.current_question]
        correct = q['answer']
        
        # 禁用所有选项按钮
        for btn in self.option_btns:
            btn.config(state=tk.DISABLED)
        
        # 标记正确/错误
        if idx == correct:
            self.quiz_score += 1
            self.option_btns[idx].config(bg='#90EE90')  # 绿色
            result = "✅ 回答正确！"
        else:
            self.option_btns[idx].config(bg='#FFB6C1')  # 淡红色
            self.option_btns[correct].config(bg='#90EE90')  # 绿色显示正确答案
            result = f"❌ 回答错误。正确答案是 {chr(65+correct)}"
        
        # 更新得分
        self.score_label.config(
            text=f"得分：{self.quiz_score} / {self.quiz_total}   |   进度：{self.current_question + 1} / {self.quiz_total}"
        )
        
        # 显示解析
        self.explain_text.config(state=tk.NORMAL)
        self.explain_text.delete(1.0, tk.END)
        self.explain_text.insert(tk.END, f"{result}\n\n💡 解析：{q['explanation']}")
        self.explain_text.config(state=tk.DISABLED)
        
        # 延时自动进入下一题
        self.current_question += 1
        self.root.after(1500, self.show_question)

    def finish_quiz(self):
        """完成闯关"""
        self.is_quiz_active = False
        
        self.question_text.config(state=tk.NORMAL)
        self.question_text.delete(1.0, tk.END)
        self.question_text.insert(tk.END, "🎉 闯关完成！")
        self.question_text.config(state=tk.DISABLED)
        
        for btn in self.option_btns:
            btn.config(state=tk.DISABLED, text="")
        
        self.score_label.config(text=f"最终得分：{self.quiz_score} / {self.quiz_total}")
        
        # 根据得分给出评价
        if self.quiz_score == self.quiz_total:
            msg = "🏆 完美通关！您对新四军历史了如指掌！"
        elif self.quiz_score >= self.quiz_total * 0.7:
            msg = "👏 表现优秀！继续深入学习历史！"
        elif self.quiz_score >= self.quiz_total * 0.5:
            msg = "📖 不错！建议重温史料，进一步了解。"
        else:
            msg = "💪 加油！多了解新四军的光辉历史！"
        
        self.explain_text.config(state=tk.NORMAL)
        self.explain_text.delete(1.0, tk.END)
        self.explain_text.insert(tk.END, msg)
        self.explain_text.config(state=tk.DISABLED)
        
        self.quiz_btn.config(text="🎯 重新闯关", bg='#8B0000')

    # ---------- 选项卡2：历史时间轴 ----------
    def create_timeline_tab(self):
        """创建历史时间轴选项卡"""
        tab = ttk.Frame(self.notebook, padding=15)
        self.notebook.add(tab, text="🕰️ 历史时间轴")
        
        # 标题
        tk.Label(
            tab,
            text="新四军发展历程 · 时间轴",
            font=('微软雅黑', 14, 'bold'),
            fg='#8B0000'
        ).pack(anchor=tk.W, pady=(0, 10))
        
        # 使用滚动文本框显示时间轴
        self.timeline_text = scrolledtext.ScrolledText(
            tab,
            font=('微软雅黑', 11),
            wrap=tk.WORD,
            bg='#fffdf5',
            height=20
        )
        self.timeline_text.pack(fill=tk.BOTH, expand=True)
        
        # 加载时间轴数据
        for year, event in TIMELINE:
            self.timeline_text.insert(tk.END, f"  ● {year}\n", 'year')
            self.timeline_text.insert(tk.END, f"    ▸ {event}\n\n", 'event')
        
        # 配置文本样式
        self.timeline_text.tag_configure('year', font=('微软雅黑', 12, 'bold'), foreground='#8B0000')
        self.timeline_text.tag_configure('event', font=('微软雅黑', 10), foreground='#333333')
        self.timeline_text.config(state=tk.DISABLED)

    # ---------- 选项卡3：英雄人物 ----------
    def create_heroes_tab(self):
        """创建英雄人物选项卡"""
        tab = ttk.Frame(self.notebook, padding=15)
        self.notebook.add(tab, text="⭐ 英雄人物")
        
        # 标题
        tk.Label(
            tab,
            text="新四军英雄人物 · 革命先驱",
            font=('微软雅黑', 14, 'bold'),
            fg='#8B0000'
        ).pack(anchor=tk.W, pady=(0, 10))
        
        # 创建带滚动条的人物卡片区域
        canvas_frame = tk.Frame(tab)
        canvas_frame.pack(fill=tk.BOTH, expand=True)
        
        canvas = tk.Canvas(canvas_frame, bg='#f5f5f5')
        scrollbar = ttk.Scrollbar(canvas_frame, orient=tk.VERTICAL, command=canvas.yview)
        scrollable_frame = tk.Frame(canvas, bg='#f5f5f5')
        
        scrollable_frame.bind(
            "<Configure>",
            lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
        )
        
        canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
        canvas.configure(yscrollcommand=scrollbar.set)
        
        canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 加载英雄卡片
        for hero in HEROES:
            card = tk.Frame(scrollable_frame, bg='white', relief=tk.RIDGE, bd=2, padx=15, pady=10)
            card.pack(fill=tk.X, pady=8, padx=5)
            
            name_label = tk.Label(
                card,
                text=f"◈ {hero['name']}",
                font=('微软雅黑', 13, 'bold'),
                fg='#8B0000',
                bg='white'
            )
            name_label.pack(anchor=tk.W)
            
            title_label = tk.Label(
                card,
                text=f"  {hero['title']}",
                font=('微软雅黑', 10),
                fg='#555555',
                bg='white'
            )
            title_label.pack(anchor=tk.W, pady=(0, 5))
            
            desc_label = tk.Label(
                card,
                text=f"  {hero['desc']}",
                font=('微软雅黑', 10),
                fg='#333333',
                bg='white',
                wraplength=550,
                justify=tk.LEFT
            )
            desc_label.pack(anchor=tk.W, fill=tk.X)


# ---------- 程序入口 ----------
if __name__ == "__main__":
    root = tk.Tk()
    app = NewFourthArmyApp(root)
    root.mainloop()