#!/usr/bin/env python3
import sys
import markdown
from PyQt6.QtWidgets import (QApplication, QMainWindow, QPushButton, 
                             QVBoxLayout, QWidget, QFileDialog, QHBoxLayout, QMessageBox)
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QMarginsF
from PyQt6.QtGui import QPageLayout, QPageSize

#
# 【ライセンスに関するお知らせ】
# 本アプリケーションで使用している PyQt6 は、GPL v3 (GNU General Public License version 3)
# の下でライセンスされています。
# The PyQt6 library is licensed under the GNU General Public License (GPL) version 3.
# 詳細については、Riverbank Computing の公式サイトまたは GNU のサイトをご確認ください。"

# --- デザイン設定 (GitHub風) ---
# ※画面上での見栄えとPDFの余白が両立するよう、paddingを少し調整(20px)しています。
CSS = """
<style>
    body { font-family: sans-serif; line-height: 1.6; max-width: 900px; margin: 0 auto; padding: 20px; color: #24292e; }
    h1, h2 { border-bottom: 1px solid #eaecef; padding-bottom: 0.3em; }
    code { background-color: #f6f8fa; padding: .2em .4em; border-radius: 3px; font-family: monospace; }
    pre { background-color: #f6f8fa; padding: 16px; border-radius: 3px; border: 1px solid #ddd; overflow: auto; }
    table { border-collapse: collapse; width: 100%; margin: 16px 0; }
    table th, table td { border: 1px solid #dfe2e5; padding: 8px 13px; }
    table th { background-color: #f6f8fa; }
    table tr:nth-child(even) { background-color: #fafbfc; }
</style>
"""

class MarkdownViewer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Ubuntu Markdown Viewer & PDF Exporter")
        self.resize(1000, 800)

        # UIレイアウトの構築
        layout = QVBoxLayout()
        top_bar = QHBoxLayout()
        
        # 📂 ファイルを開くボタン
        self.btn_open = QPushButton("📂 ファイルを選択")
        self.btn_open.setFixedHeight(40)
        self.btn_open.clicked.connect(self.select_file)
        
        # 📄 PDF保存ボタン
        self.btn_pdf = QPushButton("📄 PDFで保存 (5mm余白)")
        self.btn_pdf.setFixedHeight(40)
        self.btn_pdf.setEnabled(False)  # 初期状態は押せないようにする
        self.btn_pdf.clicked.connect(self.export_pdf)
        
        top_bar.addWidget(self.btn_open)
        top_bar.addWidget(self.btn_pdf)
        top_bar.addStretch()

        # ブラウザエンジン（表示エリア）
        self.browser = QWebEngineView()
        
        layout.addLayout(top_bar)
        layout.addWidget(self.browser)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)
        
        # 初期画面メッセージ
        self.browser.setHtml(CSS + "<h2>Ready</h2><p>.mdファイルを開いてください</p>")

    def select_file(self):
        # ファイル選択ダイアログ
        file_path, _ = QFileDialog.getOpenFileName(self, "Open MD", "", "Markdown (*.md)")
        if file_path:
            try:
                with open(file_path, "r", encoding="utf-8") as f:
                    # Markdown拡張機能を指定してHTML変換
                    html = markdown.markdown(f.read(), extensions=['tables', 'fenced_code', 'nl2br'])
                    
                    # CSSを結合してブラウザにセット
                    full_html = f"<html><head>{CSS}</head><body>{html}</body></html>"
                    self.browser.setHtml(full_html)
                    
                    self.setWindowTitle(f"Viewing: {file_path}")
                    self.btn_pdf.setEnabled(True) # PDFボタンを有効化
            except Exception as e:
                QMessageBox.critical(self, "エラー", f"ファイルの読み込みに失敗しました:\n{e}")

    def export_pdf(self):
        # PDFの保存先ダイアログ
        save_path, _ = QFileDialog.getSaveFileName(self, "PDFを保存", "output.pdf", "PDF Files (*.pdf)")
        
        if save_path:
            try:
                # --- PDFのレイアウト設定 (A4, 縦, 5mm余白) ---
                layout = QPageLayout()
                layout.setPageSize(QPageSize(QPageSize.PageSizeId.A4))
                layout.setOrientation(QPageLayout.Orientation.Portrait)
                layout.setUnits(QPageLayout.Unit.Millimeter)
                
                # 上下左右に5.0mmの余白を設定
                layout.setMargins(QMarginsF(5.0, 5.0, 5.0, 5.0))
                
                # 設定したレイアウトでPDF出力
                self.browser.page().printToPdf(save_path, layout)
                
                # 完了メッセージを表示
                QMessageBox.information(self, "保存完了", f"PDFを保存しました！\n\n保存先: {save_path}")
            except Exception as e:
                QMessageBox.critical(self, "エラー", f"PDFの保存に失敗しました:\n{e}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MarkdownViewer()
    window.show()
    sys.exit(app.exec())
