import os
import tkinter as tk
from tkinter import ttk, messagebox
from tkinter.scrolledtext import ScrolledText
from tkinterdnd2 import TkinterDnD, DND_FILES
from googletrans import Translator

# 言語の選択肢（表示名: 言語コード）
LANGUAGES = {
    "英語 (English)": "en",
    "日本語 (Japanese)": "ja",
    "韓国語 (Korean)": "ko",
    "中国語 (Chinese-Simplified)": "zh-cn",
    "中国語 [繁体字] (Chinese-Traditional)": "zh-TW",
    "スペイン語 (Spanish)": "es",
    "ドイツ語 (German)": "de",
    "フランス語 (French)": "fr"
}

class AdvancedTranslatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("D&D ファイル翻訳ツール (出力改良版)")
        # 画面サイズを広げました
        self.root.geometry("600x650")

        self.translator = Translator()

        # 1. 言語選択エリア
        lang_frame = ttk.LabelFrame(root, text=" 翻訳先の言語を選択 ", padding=10)
        lang_frame.pack(fill="x", padx=20, pady=10)

        self.lang_var = tk.StringVar(value="日本語 (Japanese)")
        self.lang_combo = ttk.Combobox(
            lang_frame,
            textvariable=self.lang_var,
            values=list(LANGUAGES.keys()),
            state="readonly"
        )
        self.lang_combo.pack(fill="x")

        # 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. 翻訳結果表示エリア (2倍以上に拡大)
        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_lang_name = self.lang_var.get()
        dest_lang = LANGUAGES[selected_lang_name]

        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()

            # 翻訳実行
            translated = self.translator.translate(text_content, dest=dest_lang)

            # 画面のテキストエリアに結果を表示
            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("=== 原文 (Original) ===\n")
                f.write(text_content)
                f.write("\n\n")
                f.write(f"=== 翻訳文 (Translated to {selected_lang_name}) ===\n")
                f.write(translated.text)

            messagebox.showinfo("成功", f"翻訳が完了しました！\n\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()
