import os
from tkinter import END, Button, Frame, Scrollbar, Text, Tk, filedialog, messagebox
from pypdf import PdfReader


class PdfReaderApp:

    def __init__(self, root):
        self.root = root
        self.root.title("PDFテキスト抽出ツール")
        self.root.geometry("650x550")

        # 状態保持用の変数
        self.extracted_text = ""
        self.current_pdf_path = ""  # 読み込んだPDFのパスを記憶

        # GUIパーツの配置
        self.setup_ui()

    def setup_ui(self):
        """画面のレイアウトを作成"""
        # スクロールバー付きのテキストエリア
        self.scrollbar = Scrollbar(self.root)
        self.scrollbar.pack(side="right", fill="y")

        # テキスト表示エリア（編集不可に設定）
        self.text_area = Text(
            self.root, yscrollcommand=self.scrollbar.set, state="disabled"
        )
        self.text_area.pack(expand=True, fill="both", padx=10, pady=10)
        self.scrollbar.config(command=self.text_area.yview)

        # 3つのボタンを横並びにするためのフレーム
        self.button_frame = Frame(self.root)
        self.button_frame.pack(fill="x", padx=10, pady=10)

        # 1.「ＰＤＦ読み込み」ボタン（左）
        self.load_button = Button(
            self.button_frame,
            text="ＰＤＦ読み込み",
            command=self.select_and_read_pdf,
            font=("MS Gothic", 11, "bold"),
            bg="#f0f0f0",
            pady=5,
        )
        self.load_button.pack(side="left", expand=True, fill="x", padx=(0, 5))

        # 2.「改行を削除」ボタン（中央）
        self.remove_nl_button = Button(
            self.button_frame,
            text="改行を削除",
            command=self.remove_newlines,
            font=("MS Gothic", 11, "bold"),
            bg="#f0f0f0",
            pady=5,
            state="disabled",
        )
        self.remove_nl_button.pack(
            side="left", expand=True, fill="x", padx=(5, 5)
        )

        # 3.「保存」ボタン（右）
        self.save_button = Button(
            self.button_frame,
            text="保存",
            command=self.manual_save,
            font=("MS Gothic", 11, "bold"),
            bg="#f0f0f0",
            pady=5,
            state="disabled",
        )
        self.save_button.pack(side="left", expand=True, fill="x", padx=(5, 0))

    def select_and_read_pdf(self):
        """PDFを選択してテキストを抽出"""
        file_path = filedialog.askopenfilename(
            title="PDFファイルを選択してください",
            filetypes=[("PDFファイル", "*.pdf")],
        )

        if not file_path:
            return

        try:
            reader = PdfReader(file_path)
            text_list = [
                page.extract_text()
                for page in reader.pages
                if page.extract_text()
            ]
            self.extracted_text = "\n".join(text_list)
            self.current_pdf_path = file_path

            # 画面への反映
            self.update_text_area(self.extracted_text)

            # ボタンを有効化
            self.remove_nl_button.config(state="normal")
            self.save_button.config(state="normal")

        except Exception as e:
            messagebox.showerror(
                "エラー", f"PDFの読み込みに失敗しました。\n{e}"
            )

    def remove_newlines(self):
        """テキスト内の改行コードを削除する"""
        if not self.extracted_text:
            return

        self.extracted_text = self.extracted_text.replace("\n", "")
        self.update_text_area(self.extracted_text)

    def manual_save(self):
        """現在のテキストをファイルに保存する"""
        if not self.extracted_text or not self.current_pdf_path:
            return

        # 【修正箇所】拡張子の前(インデックス0)を取り出してから .txt を足す
        base_path = os.path.splitext(self.current_pdf_path)[0]
        default_txt = base_path + ".txt"

        save_path = filedialog.asksaveasfilename(
            title="保存先を選択してください",
            initialdir=os.path.dirname(self.current_pdf_path),
            initialfile=os.path.basename(default_txt),
            defaultextension=".txt",
            filetypes=[("テキストファイル", "*.txt")],
        )

        if save_path:
            try:
                with open(save_path, "w", encoding="utf-8") as f:
                    f.write(self.extracted_text)
                messagebox.showinfo("成功", "ファイルを保存しました。")
            except Exception as e:
                messagebox.showerror(
                    "エラー", f"ファイルの保存に失敗しました。\n{e}"
                )

    def update_text_area(self, text):
        """テキストエリアの表示を更新する共通処理"""
        self.text_area.config(state="normal")
        self.text_area.delete("1.0", END)
        self.text_area.insert(END, text)
        self.text_area.config(state="disabled")


if __name__ == "__main__":
    root = Tk()
    app = PdfReaderApp(root)
    root.mainloop()
