#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
海外中国投资项目分析简报 - SearXNG 搜索脚本
用于补充 RSS 采集，获取更精准的项目相关信息
"""

import argparse
import json
import urllib.parse
import urllib.request
from datetime import datetime
from pathlib import Path


# 项目关键词映射
PROJECT_QUERIES = {
    '尼贝石油管道': [
        '尼贝石油管道 尼日尔 贝宁',
        'Niger Benin pipeline China',
        '尼贝管道 进展',
        '西非 石油管道 中国'
    ],
    '莱比塘铜矿': [
        '莱比塘铜矿 缅甸',
        'Letpadaung copper mine China',
        '莱比塘 抗议',
        '缅甸 铜矿 中国投资'
    ],
    '德崇扶南运河': [
        '德崇扶南运河 柬埔寨',
        'Funan Techo canal Cambodia China',
        '柬埔寨 运河 中国',
        '湄公河 运河 项目'
    ],
    '中缅石油管道': [
        '中缅石油管道',
        'China Myanmar oil pipeline',
        '中缅管道 缅甸',
        '皎漂 石油管道'
    ]
}

# 风险关键词
RISK_QUERIES = [
    '中国投资 海外 风险',
    '一带一路 项目 抗议',
    '中国公民 海外 安全',
    '中国投资 征收',
    '中国项目 罢工'
]


def searxng_search(query: str, searxng_url: str = 'http://localhost:8080') -> list:
    """执行 SearXNG 搜索"""
    results = []
    try:
        encoded_query = urllib.parse.quote(query)
        url = f'{searxng_url}/search?q={encoded_query}&format=json&language=zh-CN&language=en'
        
        req = urllib.request.Request(url, headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        })
        
        with urllib.request.urlopen(req, timeout=15) as response:
            data = json.loads(response.read().decode('utf-8'))
            
            for result in data.get('results', [])[:10]:
                results.append({
                    'title': result.get('title', ''),
                    'link': result.get('url', result.get('link', '')),
                    'summary': result.get('content', result.get('summary', '')),
                    'source': result.get('source', 'Unknown'),
                    'published': result.get('publishedDate', None)
                })
    except Exception as e:
        print(f"  ⚠ 搜索失败：{str(e)[:50]}")
    
    return results


def format_output(all_results: dict) -> str:
    """格式化输出为 Markdown"""
    output = []
    output.append("# SearXNG 搜索素材\n")
    output.append(f"**搜索时间：** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    output.append(f"**总条数：** {sum(len(v) for v in all_results.values())}\n")
    output.append("---\n")
    
    for project, results in all_results.items():
        if results:
            output.append(f"## {project}\n")
            for i, entry in enumerate(results, 1):
                output.append(f"### {i}. {entry['title']}\n")
                output.append(f"**来源：** {entry['source']}")
                if entry['published']:
                    output.append(f" **时间：** {entry['published'][:10]}")
                output.append(f"\n**链接：** {entry['link']}\n")
                if entry['summary']:
                    # 清理 HTML 标签
                    import re
                    summary = re.sub(r'<[^>]+>', '', entry['summary'])[:400]
                    output.append(f"\n**摘要：** {summary}\n")
                output.append("\n---\n")
    
    return '\n'.join(output)


def main():
    parser = argparse.ArgumentParser(description='SearXNG 搜索脚本')
    parser.add_argument('--searxng-url', default='http://localhost:8080', help='SearXNG 实例 URL')
    parser.add_argument('--output', required=True, help='输出文件路径')
    parser.add_argument('--projects', nargs='*', default=list(PROJECT_QUERIES.keys()), help='项目名称列表')
    
    args = parser.parse_args()
    
    print(f"SearXNG URL: {args.searxng_url}")
    print(f"搜索项目：{args.projects}\n")
    
    all_results = {}
    
    # 按项目搜索
    for project in args.projects:
        print(f"搜索：{project}...")
        queries = PROJECT_QUERIES.get(project, [project])
        project_results = []
        
        for query in queries:
            results = searxng_search(query, args.searxng_url)
            project_results.extend(results)
        
        # 去重
        seen = set()
        unique = []
        for r in project_results:
            if r['link'] not in seen:
                seen.add(r['link'])
                unique.append(r)
        
        all_results[project] = unique[:15]  # 每个项目最多 15 条
        print(f"  ✓ {len(all_results[project])} 条")
    
    # 搜索通用风险信息
    print(f"\n搜索：通用风险信息...")
    risk_results = []
    for query in RISK_QUERIES:
        results = searxng_search(query, args.searxng_url)
        risk_results.extend(results)
    
    # 去重
    seen = set()
    unique_risk = []
    for r in risk_results:
        if r['link'] not in seen:
            seen.add(r['link'])
            unique_risk.append(r)
    
    all_results['通用风险信息'] = unique_risk[:10]
    print(f"  ✓ {len(all_results['通用风险信息'])} 条")
    
    # 输出
    output = format_output(all_results)
    Path(args.output).parent.mkdir(parents=True, exist_ok=True)
    with open(args.output, 'w', encoding='utf-8') as f:
        f.write(output)
    
    print(f"\n输出：{args.output}")


if __name__ == '__main__':
    main()
