import tkinter as tk
from tkinter import ttk
import random


class App19:
    """サイコロシミュレーター"""

    FACES = {
        1: "⚀", 2: "⚁", 3: "⚂",
        4: "⚃", 5: "⚄", 6: "⚅",
    }
    # 各目のドット位置（サイコロ中心からの相対座標 -1〜+1）
    PIPS = {
        1: [(0, 0)],
        2: [(-1, -1), (1, 1)],
        3: [(-1, -1), (0, 0), (1, 1)],
        4: [(-1, -1), (-1, 1), (1, -1), (1, 1)],
        5: [(-1, -1), (-1, 1), (1, -1), (1, 1), (0, 0)],
        6: [(-1, -1), (-1, 0), (-1, 1), (1, -1), (1, 0), (1, 1)],
    }
    DIE_SIZE = 100

    def __init__(self, root):
        self.root = root
        self.root.title("サイコロシミュレーター")
        self.root.geometry("400x465")
        self.root.minsize(400, 465)
        self.root.configure(bg="#f8f9fc")
        self.roll_history = []
        self.rolling = False
        self._build_ui()

    def _build_ui(self):
        title_frame = tk.Frame(self.root, bg="#3776ab", pady=12)
        title_frame.pack(fill=tk.X)
        tk.Label(title_frame, text="サイコロシミュレーター",
                 font=("Noto Sans JP", 16, "bold"),
                 bg="#3776ab", fg="white").pack()

        main_frame = tk.Frame(self.root, bg="#f8f9fc", padx=24, pady=16)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # サイコロ表示（Canvas に本体と目を描く）
        self.dice_canvas = tk.Canvas(main_frame, width=self.DIE_SIZE + 10,
                                     height=self.DIE_SIZE + 10,
                                     bg="#f8f9fc", highlightthickness=0)
        self.dice_canvas.pack(pady=(0, 4))
        self._draw_die(1)

        self.result_label = tk.Label(main_frame, text="ボタンを押してサイコロを振ろう！",
                                     bg="#f8f9fc", font=("Noto Sans JP", 12), fg="#555")
        self.result_label.pack(pady=(0, 10))

        # ボタン
        btn_frame = tk.Frame(main_frame, bg="#f8f9fc")
        btn_frame.pack()
        tk.Button(btn_frame, text="🎲 振る！", font=("Noto Sans JP", 14, "bold"),
                  bg="#3776ab", fg="white", activebackground="#2a5a8a",
                  relief=tk.RAISED, bd=0, padx=20, pady=8,
                  command=self.roll).pack(side=tk.LEFT, padx=8)
        ttk.Button(btn_frame, text="リセット", command=self.reset).pack(side=tk.LEFT)

        # 統計
        stats_frame = ttk.LabelFrame(main_frame, text="統計（各目の出た回数）", padding=8)
        stats_frame.pack(fill=tk.X, pady=(12, 0))
        self.stat_labels = {}
        bg_color = self.root.cget("bg")
        for col, face in enumerate(range(1, 7)):
            tk.Label(stats_frame, text=self.FACES[face],
                     font=("Segoe UI Emoji", 18), bg=bg_color).grid(
                row=0, column=col, padx=6)
            lbl = tk.Label(stats_frame, text="0",
                           font=("Noto Sans JP", 11), bg=bg_color, fg="#555")
            lbl.grid(row=1, column=col, padx=6)
            self.stat_labels[face] = lbl

        self.total_label = tk.Label(main_frame, text="合計: 0回",
                                    bg="#f8f9fc", font=("Noto Sans JP", 10), fg="#888")
        self.total_label.pack(pady=(6, 0))

    def _draw_die(self, value):
        """Canvas にサイコロを1個描く（本体は四角形・目は create_oval）"""
        c = self.dice_canvas
        c.delete("all")
        size = self.DIE_SIZE
        x0 = y0 = 5
        c.create_rectangle(x0, y0, x0 + size, y0 + size,
                           fill="white", outline="#333", width=3)
        cx, cy = x0 + size // 2, y0 + size // 2
        offset = size // 4      # 中心から目までの距離
        r = size // 10          # 目の半径
        for ox, oy in self.PIPS[value]:
            dx, dy = cx + ox * offset, cy + oy * offset
            c.create_oval(dx - r, dy - r, dx + r, dy + r,
                          fill="#1f2933", outline="")

    def roll(self):
        if self.rolling:        # 演出中の連打を無視
            return
        self.rolling = True
        self._animate(6)

    def _animate(self, remaining):
        # after() で 80ms ごとに仮の目を描き、最後に本当の目を確定する
        if remaining > 0:
            self._draw_die(random.randint(1, 6))
            self.root.after(80, self._animate, remaining - 1)
            return
        result = random.randint(1, 6)
        self._draw_die(result)
        self.result_label.config(text=f"出た目: {result}")
        self.roll_history.append(result)
        self._update_stats()
        self.rolling = False

    def _update_stats(self):
        for face in range(1, 7):
            count = self.roll_history.count(face)
            self.stat_labels[face].config(text=str(count))
        self.total_label.config(text=f"合計: {len(self.roll_history)}回")

    def reset(self):
        self.roll_history.clear()
        self._draw_die(1)
        self.result_label.config(text="ボタンを押してサイコロを振ろう！")
        for lbl in self.stat_labels.values():
            lbl.config(text="0")
        self.total_label.config(text="合計: 0回")


if __name__ == "__main__":
    root = tk.Tk()
    app = App19(root)
    root.mainloop()
