import os
import tkinter as tk
from tkinter import ttk, messagebox
from tkinter.scrolledtext import ScrolledText
from tkinterdnd2 import TkinterDnD, DND_FILES
from deep_translator import MyMemoryTranslator

# 選択肢に中国語（簡体字・繁体字）を追加・整理しました
LANGUAGES = {
    "日本語 (Japanese)": "ja-JP",
    "英語 (English)": "en-GB",
    "中国語 [簡体字] (Chinese-Simplified)": "zh-CN",
    "中国語 [繁体字] (Chinese-Traditional)": "zh-TW",
    "韓国語 (Korean)": "ko-KR",
    "スペイン語 (Spanish)": "es-ES",
    "ドイツ語 (German)": "de-DE",
    "フランス語 (French)": "fr-FR"
}

class AdvancedTranslatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("D&D ファイル翻訳ツール (MyMemory完全版)")
        self.root.geometry("600x700")

        # 1. 言語設定エリア
        lang_frame = ttk.LabelFrame(root, text=" 言語の設定 ", padding=10)
        lang_frame.pack(fill="x", padx=20, pady=10)

        # 翻訳元（ソース）の設定
        src_label = ttk.Label(lang_frame, text="翻訳元の言語:")
        src_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")

        self.src_lang_var = tk.StringVar(value="日本語 (Japanese)")
        self.src_lang_combo = ttk.Combobox(
            lang_frame,
            textvariable=self.src_lang_var,
            values=list(LANGUAGES.keys()),
            state="readonly",
            width=22
        )
        self.src_lang_combo.grid(row=0, column=1, padx=5, pady=5)

        # 矢印アイコン
        arrow_label = ttk.Label(lang_frame, text=" ➔ ", font=("Helvetica", 12, "bold"))
        arrow_label.grid(row=0, column=2, padx=10, pady=5)

        # 翻訳先（ターゲット）の設定
        dest_label = ttk.Label(lang_frame, text="翻訳先の言語:")
        dest_label.grid(row=0, column=3, padx=5, pady=5, sticky="w")

        self.dest_lang_var = tk.StringVar(value="英語 (English)")
        self.dest_lang_combo = ttk.Combobox(
            lang_frame,
            textvariable=self.dest_lang_var,
            values=list(LANGUAGES.keys()),
            state="readonly",
            width=22
        )
        self.dest_lang_combo.grid(row=0, column=4, padx=5, pady=5)

        # 2. ドラッグ＆ドロップエリア
        self.drop_label = tk.Label(
            root,
            text="ここにテキストファイル (.txt) を\nドラッグ＆ドロップしてください",
            bg="#f0f0f0",
            relief="groove",
            borderwidth=2,
            font=("Helvetica", 11),
            height=4
        )
        self.drop_label.pack(fill="x", padx=20, pady=5)

        # D&D機能をターゲットとして登録
        self.drop_label.drop_target_register(DND_FILES)
        self.drop_label.dnd_bind('<<Drop>>', self.handle_drop)

        # 3. 翻訳結果表示エリア
        result_frame = ttk.LabelFrame(root, text=" 翻訳結果 ", padding=10)
        result_frame.pack(fill="both", expand=True, padx=20, pady=10)

        self.result_text = ScrolledText(
            result_frame,
            wrap=tk.WORD,
            font=("Helvetica", 10),
            bg="#ffffff"
        )
        self.result_text.pack(fill="both", expand=True)

    def handle_drop(self, event):
        file_path = event.data.strip('{}')

        if not file_path.endswith('.txt'):
            messagebox.showerror("エラー", "対応しているファイルは .txt のみです。")
            return

        selected_src_name = self.src_lang_var.get()
        selected_dest_name = self.dest_lang_var.get()

        src_lang = LANGUAGES[selected_src_name]
        dest_lang = LANGUAGES[selected_dest_name]

        if src_lang == dest_lang:
            messagebox.showwarning("警告", "翻訳元と翻訳先が同じ言語です。異なる言語を選択してください。")
            return

        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                text_content = f.read()

            if not text_content.strip():
                messagebox.showwarning("警告", "ファイルが空です。")
                return

            self.drop_label.config(text="翻訳中...", bg="#e1f5fe")
            self.root.update_idletasks()

            # MyMemoryでの翻訳実行
            translated_text = MyMemoryTranslator(source=src_lang, target=dest_lang).translate(text_content)

            self.result_text.delete("1.0", tk.END)
            self.result_text.insert(tk.END, translated_text)

            base, ext = os.path.splitext(file_path)
            output_path = f"{base}_translated{ext}"

            with open(output_path, 'w', encoding='utf-8') as f:
                f.write(f"=== 原文 ({selected_src_name}) ===\n")
                f.write(text_content)
                f.write("\n\n")
                f.write(f"=== 翻訳文 ({selected_dest_name}) ===\n")
                f.write(translated_text)

            messagebox.showinfo("成功", f"翻訳が完了しました！\n\n保存先: {output_path}")

        except Exception as e:
            messagebox.showerror("エラー", f"翻訳中にエラーが発生しました:\n{e}")

        finally:
            self.drop_label.config(text="ここにテキストファイル (.txt) を\nドラッグ＆ドロップしてください", bg="#f0f0f0")

if __name__ == "__main__":
    root = TkinterDnD.Tk()
    app = AdvancedTranslatorApp(root)
    root.mainloop()
