#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""省基金清单解析 v5（pdfplumber 线框）
输出：parsed/浙江_2026省基金_明细.csv、parsed/广东_2026省基金_明细.csv
校验：浙江 2667 项；广东 3171 项 / 42110 万元
"""
import csv
import io
import os
import re

import pdfplumber

BASE = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/销售分析/基金源文件'
ZJ = BASE + '/浙江_2026省自然科学基金拟资助项目清单.pdf'
GD = BASE + '/广东_2026省自然科学基金拟立项及资金安排表_转载件.pdf'
TS = {"vertical_strategy": "lines", "horizontal_strategy": "lines"}


def c(x):
    return re.sub(r'\s+', '', (x or ''))


# ── 浙江 ──
zj = []
with pdfplumber.open(ZJ) as pdf:
    for pg in pdf.pages:
        for tb in pg.extract_tables(TS):
            for r in tb:
                r = [c(x) for x in r]
                if len(r) < 6 or not r[0].isdigit():
                    continue
                if not re.match(r'[A-Z]{1,4}\d{2}', r[2]):
                    continue
                zj.append({'no': r[0], 'name': r[1], 'code': r[2], 'pi': r[3],
                           'unit': r[4], 'cat': r[5]})
print('█ 浙江:', len(zj), '项（校验 2667）')

# ── 广东（序号/主管部门为合并单元格，需前向填充）──
gd = []
with pdfplumber.open(GD) as pdf:
    for pg in pdf.pages:
        for tb in pg.extract_tables(TS):
            for r in tb:
                r = [c(x) for x in r]
                if len(r) < 8:
                    continue
                if not re.match(r'^\d+$', r[5] or ''):
                    continue
                if not r[3]:
                    continue
                gd.append({'no': r[0], 'dept': r[1], 'name': r[2], 'unit': r[3],
                           'pi': r[4], 'amt': int(r[5]), 'cat': r[7]})
print('█ 广东:', len(gd), '项（校验 3171）｜金额 %d 万元（校验 42110）' % sum(r['amt'] for r in gd))
print('   类型:', {k: sum(1 for r in gd if r['cat'] == k) for k in set(r['cat'] for r in gd)})
print('   浙江类别:', {k: sum(1 for r in zj if k in r['cat']) for k in set(r['cat'] for r in zj)})

os.makedirs(BASE + '/parsed', exist_ok=True)
with io.open(BASE + '/parsed/浙江_2026省基金_明细.csv', 'w', encoding='utf-8-sig', newline='') as f:
    w = csv.DictWriter(f, fieldnames=['no', 'name', 'code', 'pi', 'unit', 'cat'])
    w.writeheader(); w.writerows(zj)
with io.open(BASE + '/parsed/广东_2026省基金_明细.csv', 'w', encoding='utf-8-sig', newline='') as f:
    w = csv.DictWriter(f, fieldnames=['no', 'dept', 'name', 'unit', 'pi', 'amt', 'cat'])
    w.writeheader(); w.writerows(gd)
print('✅ CSV 写入 parsed/')
