import random
import time
import tkinter as tk
from tkinter import messagebox, ttk


# 漢字 → 読み方 (複数読みは | で区切り)
KANJI_DATA = {
    "桜": "さくら",
    "紅葉": "もみじ|こうよう",
    "雪": "ゆき",
    "海": "うみ",
    "山": "やま",
    "川": "かわ",
    "空": "そら",
    "星": "ほし",
    "月": "つき",
    "太陽": "たいよう",
    "風": "かぜ",
    "雲": "くも",
    "雨": "あめ",
    "虹": "にじ",
    "雷": "かみなり",
    "蝶": "ちょう",
    "蛍": "ほたる",
    "鯨": "くじら",
    "鷲": "わし",
    "象": "ぞう",
    "麒麟": "きりん",
    "薔薇": "ばら",
    "向日葵": "ひまわり",
    "紫陽花": "あじさい",
    "煙突": "えんとつ",
    "鞄": "かばん",
    "玄関": "げんかん",
    "厨房": "ちゅうぼう",
    "醤油": "しょうゆ",
    "珈琲": "コーヒー",
}


class App066:
    """漢字クイズ"""

    def __init__(self, root):
        self.root = root
        self.root.title("漢字クイズ")
        self.root.geometry("620x460")
        self.root.configure(bg="#f8f9fc")
        self.score = 0
        self.total = 0
        self.start_ts = time.time()
        self.weights = {k: 1 for k in KANJI_DATA}
        self.current = None
        self._build_ui()
        self.next_question()
        self._tick()

    def _build_ui(self):
        """UI を構築する"""
        title = tk.Frame(self.root, bg="#3776ab", pady=12)
        title.pack(fill=tk.X)
        tk.Label(title, text="漢字クイズ", font=("Noto Sans JP", 16, "bold"),
                 bg="#3776ab", fg="white").pack()

        info = tk.Frame(self.root, bg="#f8f9fc")
        info.pack(fill=tk.X, pady=8)
        self.score_label = tk.Label(info, text="正解 0 / 0",
                                    font=("Noto Sans JP", 12), bg="#f8f9fc",
                                    fg="#3776ab")
        self.score_label.pack(side=tk.LEFT, padx=20)
        self.time_label = tk.Label(info, text="経過: 0秒",
                                   font=("Noto Sans JP", 12), bg="#f8f9fc")
        self.time_label.pack(side=tk.RIGHT, padx=20)

        self.q_label = tk.Label(self.root, text="",
                                font=("Noto Sans JP", 60, "bold"),
                                bg="white", relief=tk.GROOVE,
                                width=6, height=1)
        self.q_label.pack(pady=15)

        self.entry = ttk.Entry(self.root, font=("Noto Sans JP", 16),
                               justify="center", width=18)
        self.entry.pack(pady=4)
        self.entry.bind("<Return>", lambda e: self._answer())
        self.entry.focus_set()

        btns = tk.Frame(self.root, bg="#f8f9fc")
        btns.pack(pady=8)
        ttk.Button(btns, text="回答", command=self._answer).pack(side=tk.LEFT, padx=4)
        ttk.Button(btns, text="スキップ", command=self.next_question).pack(side=tk.LEFT, padx=4)
        ttk.Button(btns, text="リセット", command=self.reset).pack(side=tk.LEFT, padx=4)

        self.fb = tk.Label(self.root, text="", bg="#f8f9fc",
                          font=("Noto Sans JP", 12))
        self.fb.pack(pady=4)

    def _weighted_choice(self):
        """重みに基づいて漢字を選ぶ"""
        items = list(self.weights.items())
        total = sum(w for _, w in items)
        r = random.uniform(0, total)
        s = 0
        for k, w in items:
            s += w
            if r <= s:
                return k
        return items[-1][0]

    def next_question(self):
        """新しい問題を出題する"""
        self.current = self._weighted_choice()
        self.q_label.config(text=self.current)
        self.entry.delete(0, tk.END)
        self.fb.config(text="")
        self.entry.focus_set()

    def _answer(self):
        """回答を判定する"""
        if self.current is None:
            return
        ans = self.entry.get().strip()
        if not ans:
            return
        self.total += 1
        accepts = KANJI_DATA[self.current].split("|")
        if ans in accepts:
            self.score += 1
            self.fb.config(text="正解！", fg="green")
            self.weights[self.current] = max(1, self.weights[self.current] - 1)
        else:
            self.fb.config(text=f"不正解。正解: {accepts[0]}", fg="red")
            self.weights[self.current] += 3
        rate = int(self.score / self.total * 100) if self.total else 0
        self.score_label.config(text=f"正解 {self.score} / {self.total}  ({rate}%)")
        # 1秒後に次の問題
        self.root.after(900, self.next_question)

    def reset(self):
        """成績をリセットする"""
        if not messagebox.askyesno("確認", "成績をリセットしますか？"):
            return
        self.score = 0
        self.total = 0
        self.start_ts = time.time()
        self.weights = {k: 1 for k in KANJI_DATA}
        self.score_label.config(text="正解 0 / 0")
        self.next_question()

    def _tick(self):
        """経過時間を更新する"""
        elapsed = int(time.time() - self.start_ts)
        self.time_label.config(text=f"経過: {elapsed}秒")
        self.root.after(1000, self._tick)


if __name__ == "__main__":
    root = tk.Tk()
    app = App066(root)
    root.mainloop()
