"""
測試 PDF/DOCX 圖表擷取與 PowerPoint 整合工具
"""

import os
import sys

# 加入模組路徑
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from doc_to_ppt_converter import (
    DOCXExtractor,
    PDFExtractor,
    PPTBuilder,
    DocToPPTConverter,
    docx_images_to_ppt,
    pdf_pages_to_ppt
)


def test_docx_extraction():
    """測試 DOCX 圖片擷取"""
    print("=" * 60)
    print("測試 1: DOCX 圖片擷取")
    print("=" * 60)

    # 使用實際的估價報告 DOCX
    docx_path = r"C:\Users\User\Documents\GitHub\ai_re_valuation\documents\H114B001-3-9 彰化市福竹段221地號(出售)\H114B001-3-9 彰化市福竹段221地號(出售)_v5(修正比準地價格).docx"

    if not os.path.exists(docx_path):
        print(f"找不到測試檔案: {docx_path}")
        return None

    # 先列出圖片資訊
    extractor = DOCXExtractor(docx_path)
    images_info = extractor.list_images()

    print(f"\n檔案: {os.path.basename(docx_path)}")
    print(f"發現 {len(images_info)} 張嵌入圖片:")
    for img in images_info:
        size_kb = img['size'] / 1024
        print(f"  - {img['name']} ({size_kb:.1f} KB)")

    # 擷取圖片
    output_dir = "./test_output/docx_images"
    images = extractor.extract_all_images(output_dir)

    return images


def test_pdf_extraction():
    """測試 PDF 頁面擷取"""
    print("\n" + "=" * 60)
    print("測試 2: PDF 頁面擷取")
    print("=" * 60)

    # 搜尋可用的 PDF
    pdf_path = r"C:\Users\User\.claude\plugins\marketplaces\anthropic-agent-skills\theme-factory\theme-showcase.pdf"

    if not os.path.exists(pdf_path):
        print(f"找不到測試檔案: {pdf_path}")
        return None

    print(f"\n檔案: {os.path.basename(pdf_path)}")

    with PDFExtractor(pdf_path) as extractor:
        print(f"總頁數: {extractor.page_count}")

        # 擷取前 2 頁
        output_dir = "./test_output/pdf_pages"
        pages_to_extract = [0, 1] if extractor.page_count >= 2 else [0]
        images = extractor.extract_pages(pages_to_extract, output_dir, dpi=150)

    return images


def test_create_presentation():
    """測試建立簡報"""
    print("\n" + "=" * 60)
    print("測試 3: 建立 PowerPoint 簡報")
    print("=" * 60)

    # 收集測試圖片
    test_images = []
    test_titles = []

    # 從 DOCX 測試輸出收集圖片
    docx_output = "./test_output/docx_images"
    if os.path.exists(docx_output):
        for f in os.listdir(docx_output):
            if f.lower().endswith(('.png', '.jpg', '.jpeg')):
                test_images.append(os.path.join(docx_output, f))
                test_titles.append(f"DOCX 圖片: {f}")

    # 從 PDF 測試輸出收集圖片
    pdf_output = "./test_output/pdf_pages"
    if os.path.exists(pdf_output):
        for f in os.listdir(pdf_output):
            if f.lower().endswith('.png'):
                test_images.append(os.path.join(pdf_output, f))
                test_titles.append(f"PDF 頁面: {f}")

    if not test_images:
        print("沒有可用的測試圖片")
        return None

    print(f"\n準備建立簡報，共 {len(test_images)} 張圖片")

    # 建立簡報
    builder = PPTBuilder()
    builder.add_multiple_images(test_images[:5], test_titles[:5])  # 最多取 5 張

    output_ppt = "./test_output/test_presentation.pptx"
    result = builder.save(output_ppt)

    return result


def test_integrated_converter():
    """測試整合型轉換器"""
    print("\n" + "=" * 60)
    print("測試 4: 整合型轉換器 (DocToPPTConverter)")
    print("=" * 60)

    docx_path = r"C:\Users\User\Documents\GitHub\ai_re_valuation\documents\H114B001-3-9 彰化市福竹段221地號(出售)\H114B001-3-9 彰化市福竹段221地號(出售)_v5(修正比準地價格).docx"

    if not os.path.exists(docx_path):
        print(f"找不到測試檔案")
        return None

    converter = DocToPPTConverter(output_dir="./test_output/integrated")

    # 從 DOCX 擷取圖片（只取 PNG 和 JPG）
    converter.extract_from_docx(docx_path, extensions=['png', 'jpg', 'jpeg'])

    # 建立簡報
    output_ppt = "./test_output/integrated_presentation.pptx"
    result = converter.create_presentation(output_ppt)

    # 保留圖片供檢視
    converter.cleanup(keep_images=True)

    return result


def main():
    """主測試程式"""
    print("\n" + "=" * 60)
    print("PDF/DOCX 圖表擷取與 PowerPoint 整合工具 - 測試")
    print("=" * 60)

    # 切換到腳本目錄
    os.chdir(os.path.dirname(os.path.abspath(__file__)))

    # 建立測試輸出資料夾
    os.makedirs("./test_output", exist_ok=True)

    results = {}

    # 測試 1: DOCX 擷取
    try:
        results['docx'] = test_docx_extraction()
        print("\n[PASS] DOCX 擷取測試通過")
    except Exception as e:
        print(f"\n[FAIL] DOCX 擷取測試失敗: {e}")
        results['docx'] = None

    # 測試 2: PDF 擷取
    try:
        results['pdf'] = test_pdf_extraction()
        print("\n[PASS] PDF 擷取測試通過")
    except Exception as e:
        print(f"\n[FAIL] PDF 擷取測試失敗: {e}")
        results['pdf'] = None

    # 測試 3: 建立簡報
    try:
        results['ppt'] = test_create_presentation()
        print("\n[PASS] 建立簡報測試通過")
    except Exception as e:
        print(f"\n[FAIL] 建立簡報測試失敗: {e}")
        results['ppt'] = None

    # 測試 4: 整合轉換器
    try:
        results['integrated'] = test_integrated_converter()
        print("\n[PASS] 整合轉換器測試通過")
    except Exception as e:
        print(f"\n[FAIL] 整合轉換器測試失敗: {e}")
        results['integrated'] = None

    # 總結
    print("\n" + "=" * 60)
    print("測試結果總結")
    print("=" * 60)

    passed = sum(1 for v in results.values() if v is not None)
    total = len(results)

    print(f"\n通過: {passed}/{total}")

    if results['docx']:
        print(f"  - DOCX 擷取: {len(results['docx'])} 張圖片")
    if results['pdf']:
        print(f"  - PDF 擷取: {len(results['pdf'])} 頁")
    if results['ppt']:
        print(f"  - 簡報: {results['ppt']}")
    if results['integrated']:
        print(f"  - 整合簡報: {results['integrated']}")

    print("\n測試輸出資料夾: ./test_output/")
    print("=" * 60)


if __name__ == "__main__":
    main()
