#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成HTML报告"""

import json, os

BASE = "/data/www/files/scQxYjs"

with open(f"{BASE}/_complete_results.json", "r") as f:
    data = json.load(f)

# 统计
total_items = 0
total_amount = 0.0
kw_stats = {}
city_stats = {}
total_org = 0
total_dx = 0

for city in data:
    city_total = 0
    city_items = 0
    for ut in data[city]:
        for county in data[city][ut]:
            for item in data[city][ut][county]:
                total_items += 1
                total_amount += item['amount']
                city_total += item['amount']
                city_items += 1
                kw = item['keyword']
                if kw not in kw_stats:
                    kw_stats[kw] = {'count': 0, 'amount': 0}
                kw_stats[kw]['count'] += item.get('count', 1)
                kw_stats[kw]['amount'] += item['amount']
        if ut == '组织部':
            total_org += sum(len(data[city][ut][c]) for c in data[city][ut])
        elif ut == '党校':
            total_dx += sum(len(data[city][ut][c]) for c in data[city][ut])
    city_stats[city] = {'items': city_items, 'amount': round(city_total, 2)}

total_amount = round(total_amount, 2)

# 关键字排序
kw_sorted = sorted(kw_stats.keys(), key=lambda k: kw_stats[k]['amount'], reverse=True)

# 市州排序
city_sorted = sorted(city_stats.keys(), key=lambda c: city_stats[c]['amount'], reverse=True)

# 生成关键字分布条形图数据
max_kw_amount = max(kw_stats[k]['amount'] for k in kw_stats) if kw_stats else 1

# 生成HTML
html = f'''<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>四川区县预算关键字分析报告</title>
<style>
*{{margin:0;padding:0;box-sizing:border-box}}
body{{background:#0d1117;color:#c9d1d9;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;padding:20px}}
.header{{text-align:center;padding:40px 0;background:linear-gradient(135deg,#1a1f35,#0f1623);border-radius:12px;margin-bottom:20px;border:1px solid #30363d}}
.header h1{{font-size:28px;color:#58a6ff;margin-bottom:8px}}
.header p{{color:#8b949e;font-size:14px}}

/* 汇总看板 */
.summary-board{{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-bottom:24px}}
.summary-card{{background:#161b22;border:1px solid #30363d;border-radius:10px;padding:20px;text-align:center}}
.summary-card .label{{color:#8b949e;font-size:13px;margin-bottom:6px}}
.summary-card .value{{font-size:28px;font-weight:700;color:#58a6ff}}
.summary-card .unit{{font-size:13px;color:#8b949e;margin-left:4px}}
.summary-card.amount .value{{color:#3fb950}}

/* 关键字分布 */
.kw-section{{background:#161b22;border:1px solid #30363d;border-radius:10px;padding:20px;margin-bottom:24px}}
.kw-section h2{{font-size:18px;color:#58a6ff;margin-bottom:16px;border-bottom:1px solid #30363d;padding-bottom:10px}}
.kw-bar{{display:flex;align-items:center;margin-bottom:8px;gap:8px}}
.kw-bar .kw-label{{width:80px;text-align:right;font-size:13px;color:#c9d1d9;flex-shrink:0}}
.kw-bar .kw-bar-track{{flex:1;height:24px;background:#21262d;border-radius:4px;overflow:hidden;position:relative}}
.kw-bar .kw-bar-fill{{height:100%;background:linear-gradient(90deg,#1f6feb,#388bfd);border-radius:4px;transition:width 0.3s}}
.kw-bar .kw-count{{position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:12px;color:#8b949e}}
.kw-bar .kw-amount{{width:120px;text-align:right;font-size:13px;color:#3fb950;flex-shrink:0}}

/* 市州导航 */
.city-nav{{background:#161b22;border:1px solid #30363d;border-radius:10px;padding:16px;margin-bottom:24px}}
.city-nav h2{{font-size:16px;color:#58a6ff;margin-bottom:12px}}
.city-nav-items{{display:flex;flex-wrap:wrap;gap:8px}}
.city-nav-item{{background:#21262d;border:1px solid #30363d;border-radius:6px;padding:6px 14px;font-size:13px;color:#58a6ff;cursor:pointer;text-decoration:none;transition:all 0.2s}}
.city-nav-item:hover{{background:#1f6feb;color:#fff;border-color:#1f6feb}}

/* 搜索 */
.search-box{{width:100%;padding:10px 16px;background:#161b22;border:1px solid #30363d;border-radius:8px;color:#c9d1d9;font-size:14px;margin-bottom:24px}}
.search-box:focus{{outline:none;border-color:#1f6feb}}

/* 市州区块 */
.city-section{{background:#161b22;border:1px solid #30363d;border-radius:10px;margin-bottom:20px;overflow:hidden}}
.city-header{{background:#1a1f35;padding:16px 20px;cursor:pointer;display:flex;justify-content:space-between;align-items:center}}
.city-header h2{{font-size:18px;color:#58a6ff}}
.city-header .city-summary{{font-size:13px;color:#8b949e}}
.city-body{{padding:16px 20px}}

/* 区县区块 */
.county-block{{background:#0d1117;border:1px solid #21262d;border-radius:8px;margin-bottom:16px;overflow:hidden}}
.county-header{{background:#161b22;padding:12px 16px;font-size:15px;color:#c9d1d9;font-weight:600;border-bottom:1px solid #21262d}}

/* 单位类型区块 */
.unit-section{{padding:12px 16px}}
.unit-section.org{{border-left:3px solid #1f6feb}}
.unit-section.dx{{border-left:3px solid #d29922}}
.unit-title{{font-size:14px;font-weight:600;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center}}
.unit-title.org{{color:#58a6ff}}
.unit-title.dx{{color:#d29922}}
.unit-title .unit-total{{font-size:13px;color:#3fb950;font-weight:400}}

/* 表格 */
.match-table{{width:100%;border-collapse:collapse;font-size:13px}}
.match-table th{{background:#161b22;padding:8px 10px;text-align:left;color:#8b949e;font-weight:600;border-bottom:1px solid #30363d}}
.match-table td{{padding:8px 10px;border-bottom:1px solid #21262d;color:#c9d1d9}}
.match-table tr:hover{{background:#161b22}}
.kw-tag{{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600}}
.kw-tag[data-kw="培训"]{{background:#1a3a5c;color:#58a6ff}}
.kw-tag[data-kw="维护"]{{background:#2a1a3c;color:#bc8cff}}
.kw-tag[data-kw="设备"]{{background:#1a3a2c;color:#3fb950}}
.kw-tag[data-kw="系统"]{{background:#3a2a1a;color:#d29922}}
.kw-tag[data-kw="信息化"]{{background:#1a2a3a;color:#79c0ff}}
.kw-tag[data-kw="网络"]{{background:#2a1a1a;color:#f85149}}
.kw-tag[data-kw="数字"]{{background:#1a3a3a;color:#39d0d0}}
.kw-tag[data-kw="平台"]{{background:#3a1a3a;color:#db61a2}}
.kw-tag[data-kw="视频"]{{background:#2a2a1a;color:#e3b341}}
.kw-tag[data-kw="课件"]{{background:#1a2a1a;color:#a5d6a7}}
.kw-tag[data-kw="能力提升"]{{background:#2a3a1a;color:#c9d028}}
.kw-tag[data-kw="软件"]{{background:#3a2a2a;color:#ff9800}}
.kw-tag[data-kw="网络培训"]{{background:#1a3a3c;color:#56d4dd}}
.kw-tag[data-kw="党员教育片"]{{background:#3c1a1a;color:#ef5350}}
.kw-tag[data-kw="视频拍摄"]{{background:#3c2a1a;color:#ffb74d}}
.kw-tag[data-kw="课程制作"]{{background:#2a1a3a;color:#ce93d8}}
.kw-tag[data-kw="直播"]{{background:#1a2a3c;color:#64b5f6}}
.kw-tag{{background:#21262d;color:#c9d1d9}}
.amount-cell{{color:#3fb950;font-weight:600;text-align:right}}
.file-link{{color:#58a6ff;text-decoration:none;font-size:12px}}
.file-link:hover{{text-decoration:underline}}
.empty{{color:#8b949e;font-style:italic;padding:12px;text-align:center}}

/* 底部 */
.footer{{text-align:center;padding:20px;color:#8b949e;font-size:12px;border-top:1px solid #30363d;margin-top:20px}}
</style>
</head>
<body>

<div class="header">
<h1>📊 四川省区县预算关键字分析报告</h1>
<p>2026年度部门预算公开 · 17项关键字匹配 · 21个市州 · 组织部/党校分类分析</p>
</div>

<!-- 汇总看板 -->
<div class="summary-board">
<div class="summary-card"><div class="label">覆盖市州</div><div class="value">{len(data)}</div></div>
<div class="summary-card"><div class="label">预算文件</div><div class="value">483</div></div>
<div class="summary-card"><div class="label">匹配项</div><div class="value">{total_items}</div></div>
<div class="summary-card amount"><div class="label">总预算金额</div><div class="value">{total_amount:,.2f}<span class="unit">万元</span></div></div>
<div class="summary-card"><div class="label">组织部匹配</div><div class="value">{total_org}</div></div>
<div class="summary-card"><div class="label">党校匹配</div><div class="value">{total_dx}</div></div>
</div>

<!-- 关键字分布 -->
<div class="kw-section">
<h2>🔑 关键字匹配分布</h2>
'''

for kw in kw_sorted:
    s = kw_stats[kw]
    pct = (s['amount'] / max_kw_amount * 100) if max_kw_amount > 0 else 0
    html += f'''<div class="kw-bar">
<div class="kw-label">{kw}</div>
<div class="kw-bar-track">
<div class="kw-bar-fill" style="width:{pct:.1f}%"></div>
<span class="kw-count">{s['count']}次</span>
</div>
<div class="kw-amount">{s['amount']:,.2f}万元</div>
</div>
'''

html += '''</div>

<!-- 市州导航 -->
<div class="city-nav">
<h2>🗺️ 市州快速导航</h2>
<div class="city-nav-items">
'''

for city in city_sorted:
    s = city_stats[city]
    html += f'<a class="city-nav-item" href="#city-{city}">{city} ({s["items"]}项)</a>\n'

html += '''</div>
</div>

<!-- 搜索 -->
<input type="text" class="search-box" placeholder="🔍 搜索区县/关键字/内容..." oninput="filterContent(this.value)">

<!-- 市州数据 -->
'''

for city in city_sorted:
    s = city_stats[city]
    city_data = data[city]
    
    html += f'''
<!-- {city} -->
<div class="city-section" id="city-{city}">
<div class="city-header" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='none'?'block':'none'">
<h2>📍 {city}</h2>
<div class="city-summary">{s["items"]}项匹配 · 预算{s["amount"]:,.2f}万元</div>
</div>
<div class="city-body">
'''
    
    # 收集该市州所有区县
    all_counties = set()
    for ut in ['组织部', '党校', '其他']:
        if ut in city_data:
            all_counties.update(city_data[ut].keys())
    
    for county in sorted(all_counties):
        html += f'<div class="county-block">\n'
        html += f'<div class="county-header">📂 {county}</div>\n'
        
        for ut_key, ut_label, ut_class in [('组织部', '📋 组织部', 'org'), ('党校', '🎓 党校', 'dx'), ('其他', '📄 其他', 'org')]:
            if ut_key not in city_data or county not in city_data[ut_key]:
                continue
            
            items = city_data[ut_key][county]
            if not items:
                continue
            
            unit_total = sum(item['amount'] for item in items)
            
            html += f'<div class="unit-section {ut_class}">\n'
            html += f'<div class="unit-title {ut_class}">{ut_label} <span class="unit-total">汇总: {unit_total:,.2f}万元</span></div>\n'
            html += f'<table class="match-table">\n'
            html += f'<thead><tr><th>关键字</th><th>匹配内容</th><th>文件位置</th><th style="text-align:right">预算金额</th><th>打开文件</th></tr></thead>\n<tbody>\n'
            
            for item in sorted(items, key=lambda x: x['amount'], reverse=True):
                kw = item['keyword']
                content = item.get('contents_str', item.get('content', ''))[:80]
                location = item.get('locations_str', item.get('location', ''))[:60]
                amount = item['amount']
                count = item.get('count', 1)
                file_url = item.get('file_urls_str', item.get('file_url', '')).split('；')[0] if item.get('file_urls_str') else item.get('file_url', '')
                file_name = item.get('files_str', item.get('file', '')).split('；')[0] if item.get('files_str') else item.get('file', '')
                
                # 如果file_url为空，用file_name构建
                if not file_url and file_name:
                    file_url = f"/scQxYjs/{city}/{file_name}"
                
                count_str = f' ({count}项合并)' if count > 1 else ''
                amount_str = f'{amount:,.2f}万元' if amount > 0 else '—'
                
                html += f'<tr>'
                html += f'<td><span class="kw-tag" data-kw="{kw}">{kw}</span></td>'
                html += f'<td>{content}{count_str}</td>'
                html += f'<td style="font-size:12px;color:#8b949e">{location}</td>'
                html += f'<td class="amount-cell">{amount_str}</td>'
                html += f'<td><a class="file-link" href="{file_url}" target="_blank">📂 {file_name[:20]}{"..." if len(file_name)>20 else ""}</a></td>'
                html += f'</tr>\n'
            
            html += '</tbody></table>\n</div>\n'
        
        html += '</div>\n'  # county-block end
    
    html += '</div>\n</div>\n'  # city-body, city-section end

html += '''
<div class="footer">
<p>四川省区县预算关键字分析报告 · 2026年度</p>
<p>数据来源：各市州区县部门预算公开文件 · 共483个文件 · 17项关键字匹配</p>
</div>

<script>
function filterContent(query) {
    query = query.trim().toLowerCase();
    document.querySelectorAll('.county-block').forEach(block => {
        if (!query) {
            block.style.display = '';
            block.closest('.city-section').style.display = '';
            return;
        }
        let text = block.textContent.toLowerCase();
        let match = text.includes(query);
        block.style.display = match ? '' : 'none';
        block.closest('.city-section').style.display = match ? '' : 'none';
    });
}
</script>
</body>
</html>
'''

output_path = f"{BASE}/report.html"
with open(output_path, 'w', encoding='utf-8') as f:
    f.write(html)

print(f"报告已生成: {output_path}")
print(f"文件大小: {os.path.getsize(output_path)/1024:.1f}KB")
