#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""提取 规则文件/ 下全部文档内容 → /tmp/rule_*.txt（供阅读与规则库落地）"""
import os
import glob
import subprocess

D = os.path.expanduser('~/Desktop/Hermes输出-工作类/报销助手/规则文件/CA-01-03-A3付款、费用报销管理制度')
OUT = '/tmp'


def do_pdf(p):
    import fitz
    doc = fitz.open(p)
    txt = '\n'.join(page.get_text() for page in doc)
    name = os.path.basename(p)
    out = os.path.join(OUT, 'rule_pdf_' + name.replace('/', '_')[:28] + '.txt')
    open(out, 'w', encoding='utf-8').write(txt)
    print('  📄 %-46s 页数=%-4d 文本层=%-7d 字 → %s' % (name[:44], len(doc), len(txt.strip()), os.path.basename(out)))
    doc.close()
    return len(txt.strip())


def do_pptx(p):
    from pptx import Presentation
    prs = Presentation(p)
    out = []
    for i, s in enumerate(prs.slides, 1):
        txts = []
        for sh in s.shapes:
            if sh.has_text_frame and sh.text_frame.text.strip():
                txts.append(sh.text_frame.text.strip())
            if sh.has_table:
                for r in sh.table.rows:
                    txts.append(' | '.join(c.text.strip() for c in r.cells))
        if s.has_notes_slide and s.notes_slide.notes_text_frame.text.strip():
            txts.append('[备注] ' + s.notes_slide.notes_text_frame.text.strip())
        if txts:
            out.append('=== 第%d页 ===\n%s' % (i, '\n'.join(txts)))
    t = '\n\n'.join(out)
    f = os.path.join(OUT, 'rule_pptx.txt')
    open(f, 'w', encoding='utf-8').write(t)
    print('  📊 %-46s 页数=%-4d 文本=%-7d 字 → %s' % (os.path.basename(p)[:44], len(prs.slides), len(t), os.path.basename(f)))


def do_doc(p):
    f = os.path.join(OUT, 'rule_doc.txt')
    r = subprocess.run(['textutil', '-convert', 'txt', '-output', f, p], capture_output=True, text=True)
    n = len(open(f, encoding='utf-8', errors='ignore').read().strip()) if os.path.exists(f) else 0
    print('  📝 %-46s 文本=%-7d 字 → %s %s' % (os.path.basename(p)[:44], n, os.path.basename(f), r.stderr.strip()[:40]))


def do_xlsx(p):
    import pandas as pd
    xl = pd.ExcelFile(p)
    lines = []
    for sh in xl.sheet_names:
        df = xl.parse(sh, header=None, dtype=str)
        lines.append('=== Sheet: %s （%d 行 × %d 列）===' % (sh, len(df), len(df.columns)))
        for i, row in df.head(18).iterrows():
            cells = [str(c) for c in row.tolist() if str(c) != 'nan' and str(c).strip()]
            if cells:
                lines.append('  ' + ' | '.join(cells)[:220])
    t = '\n'.join(lines)
    f = os.path.join(OUT, 'rule_xlsx_%s.txt' % os.path.basename(p)[:16].replace(' ', '_'))
    open(f, 'w', encoding='utf-8').write(t)
    print('  📗 %-46s Sheet=%-3d → %s' % (os.path.basename(p)[:44], len(xl.sheet_names), os.path.basename(f)))


print('提取目录:', D)
print()
for p in sorted(glob.glob(os.path.join(D, '*'))):
    if os.path.basename(p).startswith('.'):
        continue
    try:
        if p.lower().endswith('.pdf'):
            do_pdf(p)
        elif p.lower().endswith('.pptx'):
            do_pptx(p)
        elif p.lower().endswith('.doc'):
            do_doc(p)
        elif p.lower().endswith('.xlsx'):
            do_xlsx(p)
    except Exception as e:
        print('  ❌ %-46s %s' % (os.path.basename(p)[:44], str(e)[:70]))
