import tkinter as tk
from tkinter import ttk, simpledialog, messagebox
import json
import os


class App082:
    """時間割ビューアー"""

    DAYS = ("月", "火", "水", "木", "金")
    PERIODS = 6
    SAVE_FILE = "timetable.json"

    def __init__(self, root):
        self.root = root
        self.root.title("時間割ビューアー")
        self.root.geometry("680x485")
        self.root.minsize(680, 485)
        self.root.configure(bg="#f8f9fc")
        # data[period][day] = subject
        self.data = [["" for _ in self.DAYS] for _ in range(self.PERIODS)]
        self._build_ui()
        self._load()
        self._refresh()

    def _build_ui(self):
        """UIを構築する"""
        title_frame = tk.Frame(self.root, bg="#3776ab", pady=10)
        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=20, pady=20)
        main_frame.pack(fill=tk.BOTH, expand=True)

        grid_frame = tk.Frame(main_frame, bg="#f8f9fc")
        grid_frame.pack(fill=tk.BOTH, expand=True)

        # ヘッダー
        tk.Label(grid_frame, text="", width=8, bg="#dee2e6", relief=tk.RIDGE).grid(row=0, column=0, sticky="nsew")
        for c, day in enumerate(self.DAYS):
            tk.Label(grid_frame, text=day, bg="#dee2e6", relief=tk.RIDGE, font=("Noto Sans JP", 11, "bold")).grid(row=0, column=c + 1, sticky="nsew")

        self.cell_labels = []  # [[label]]
        for r in range(self.PERIODS):
            tk.Label(grid_frame, text=f"{r+1}限", bg="#dee2e6", relief=tk.RIDGE, font=("Noto Sans JP", 11, "bold")).grid(row=r + 1, column=0, sticky="nsew")
            row_labels = []
            for c in range(len(self.DAYS)):
                lab = tk.Label(grid_frame, text="", bg="white", relief=tk.RIDGE, font=("Noto Sans JP", 11), height=2)
                lab.grid(row=r + 1, column=c + 1, sticky="nsew", padx=1, pady=1)
                lab.bind("<Button-1>", lambda e, r=r, c=c: self.edit_cell(r, c))
                row_labels.append(lab)
            self.cell_labels.append(row_labels)

        for c in range(len(self.DAYS) + 1):
            grid_frame.columnconfigure(c, weight=1)
        for r in range(self.PERIODS + 1):
            grid_frame.rowconfigure(r, weight=1)

        btn_frame = tk.Frame(main_frame, bg="#f8f9fc")
        btn_frame.pack(pady=8)
        ttk.Button(btn_frame, text="保存", command=self._save).pack(side=tk.LEFT, padx=4)
        ttk.Button(btn_frame, text="クリア", command=self.clear_all).pack(side=tk.LEFT, padx=4)

        tk.Label(main_frame, text="セルをクリックして授業名を入力してください。",
                 bg="#f8f9fc", fg="#666").pack(anchor="w")

    def edit_cell(self, r, c):
        """セルをクリックで編集"""
        cur = self.data[r][c]
        val = simpledialog.askstring(
            "授業入力", f"{r+1}限 {self.DAYS[c]}曜日の授業名:", initialvalue=cur
        )
        if val is None:
            return
        self.data[r][c] = val.strip()
        self._save()
        self._refresh()

    def clear_all(self):
        """全セルクリア（要確認）"""
        if not messagebox.askyesno("確認", "全セルをクリアしますか?"):
            return
        self.data = [["" for _ in self.DAYS] for _ in range(self.PERIODS)]
        self._save()
        self._refresh()

    def _refresh(self):
        """表示を再描画"""
        for r in range(self.PERIODS):
            for c in range(len(self.DAYS)):
                v = self.data[r][c]
                self.cell_labels[r][c].config(text=v if v else "—", fg="#222" if v else "#bbb")

    def _load(self):
        """JSON保存ファイルを読込"""
        if os.path.exists(self.SAVE_FILE):
            try:
                with open(self.SAVE_FILE, "r", encoding="utf-8") as f:
                    d = json.load(f)
                if isinstance(d, list) and len(d) == self.PERIODS:
                    self.data = [[(row[c] if c < len(row) else "") for c in range(len(self.DAYS))] for row in d]
            except Exception:
                pass

    def _save(self):
        """JSONに保存"""
        try:
            with open(self.SAVE_FILE, "w", encoding="utf-8") as f:
                json.dump(self.data, f, ensure_ascii=False, indent=2)
        except Exception as e:
            messagebox.showerror("エラー", f"保存失敗: {e}")


if __name__ == "__main__":
    root = tk.Tk()
    app = App082(root)
    root.mainloop()
