import tkinter as tk
from tkinter import messagebox, filedialog
import subprocess
import os

CHEAT_SHEET = '''; === SBaGen チートシート ===
; 書式: 時間 左-右 チャンネル オプション
; 例: +0:00:00 400-410 L

; 左400Hz, 右410Hz → 10Hzビート（L=左基準）
+0:00:00 400-410 L

; 時間経過後の周波数変化（10分後に420Hz/430Hzへ）
+0:10:00 420-430 L

; 音声終了（20分後）
+0:20:00 off

; 背景音の追加（最初に記述）
_ = mix(nature.wav, 0.3)

; ノイズを加える（例: white, pink）
_ = mix(white, 0.1)

; チャンネル指定:
;   L = 左ベース（左耳に指定周波数、右に +差分）
;   R = 右ベース
;   S = ステレオ完全分離（各耳に別の周波数）
'''

class SBGEditor:
    def __init__(self, master):
        self.master = master
        master.title("SBaGen GUIエディタ（環境音対応）")
        master.geometry("640x580")

        self.steps = []
        self.env_file = None
        self.env_volume = tk.DoubleVar(value=0.3)

        self.frame = tk.Frame(master)
        self.frame.pack(pady=10)

        tk.Label(self.frame, text="時間（+HH:MM:SS）").grid(row=0, column=0)
        tk.Label(self.frame, text="左耳周波数").grid(row=0, column=1)
        tk.Label(self.frame, text="右耳周波数").grid(row=0, column=2)

        self.time_entry = tk.Entry(self.frame)
        self.left_entry = tk.Entry(self.frame)
        self.right_entry = tk.Entry(self.frame)
        self.time_entry.grid(row=1, column=0)
        self.left_entry.grid(row=1, column=1)
        self.right_entry.grid(row=1, column=2)

        tk.Button(self.frame, text="追加", command=self.add_step).grid(row=1, column=3, padx=10)

        env_frame = tk.LabelFrame(master, text="🔊 環境音の追加（mix）", padx=10, pady=10)
        env_frame.pack(padx=10, pady=10, fill="x")

        tk.Button(env_frame, text="環境音を選択（WAV/MP3）", command=self.select_env_file).pack(pady=5)

        tk.Label(env_frame, text="音量:").pack()
        tk.Scale(env_frame, from_=0.0, to=1.0, resolution=0.01, variable=self.env_volume, orient="horizontal").pack(fill="x")

        self.env_label = tk.Label(env_frame, text="現在: 未選択")
        self.env_label.pack()

        # スクリプト表示欄
        self.script_box = tk.Text(master, height=20)
        self.script_box.pack(padx=10, pady=10, fill="both", expand=True)
        self.script_box.insert("1.0", CHEAT_SHEET)

        btn_frame = tk.Frame(master)
        btn_frame.pack(pady=10)

        tk.Button(btn_frame, text="💾 保存（.sbg）", command=self.save_file, width=20).pack(side="left", padx=10)
        tk.Button(btn_frame, text="▶ 再生（sbagen）", command=self.play_sbagen, width=20).pack(side="right", padx=10)

    def add_step(self):
        time = self.time_entry.get()
        left = self.left_entry.get()
        right = self.right_entry.get()
        if not (time and left and right):
            messagebox.showwarning("未入力", "すべてのフィールドを入力してください。")
            return
        line = f"{time} {left}-{right} L"
        self.script_box.insert("end", line + "\n")
        self.steps.append(line)

    def select_env_file(self):
        file = filedialog.askopenfilename(filetypes=[("音声ファイル", "*.wav *.mp3")])
        if file:
            self.env_file = file
            self.env_label.config(text=f"現在: {os.path.basename(file)}")

    def insert_env_mix(self, text_lines):
        if self.env_file:
            path = os.path.abspath(self.env_file).replace("\\", "/")
            mix_line = f"_ = mix({path}, {self.env_volume.get():.2f})"
            text_lines.insert(0, mix_line)
        return text_lines

    def save_file(self):
        filename = filedialog.asksaveasfilename(defaultextension=".sbg", filetypes=[("SBaGen Script", "*.sbg")])
        if filename:
            lines = self.script_box.get("1.0", "end").strip().split("\n")
            full_script = self.insert_env_mix(lines)
            with open(filename, "w") as f:
                f.write("\n".join(full_script))
            messagebox.showinfo("保存完了", f"{filename} を保存しました。")

    def play_sbagen(self):
        lines = self.script_box.get("1.0", "end").strip().split("\n")
        full_script = self.insert_env_mix(lines)
        with open("temp_play.sbg", "w") as f:
            f.write("\n".join(full_script))
        try:
            subprocess.run(["./sbagen-1.4.5/sbagen", "temp_play.sbg"])
        except FileNotFoundError:
            messagebox.showerror("再生失敗", "sbagen が見つかりません。パスを確認してください。")

if __name__ == "__main__":
    root = tk.Tk()
    app = SBGEditor(root)
    root.mainloop()
