#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高校舆情分析 - 数据采集脚本
从境外主流媒体和社交平台采集中国高校相关舆情信息
"""

import json
import os
import sys
import time
import requests
from datetime import datetime, timedelta

# 配置
SEARXNG_URL = os.environ.get('SEARXNG_URL', 'http://localhost:8080/search')
OUTPUT_DIR = os.environ.get('UNIVERSITY_SENTIMENT_OUTPUT_DIR',
    os.path.expanduser('~/.openclaw/workspace/reports/university-sentiment'))
HOURLY_DIR = os.path.join(OUTPUT_DIR, 'hourly')
LOG_FILE = os.path.join(OUTPUT_DIR, 'collect.log')

# 搜索查询（境外媒体 + 社交平台覆盖）
QUERIES = [
    # 高校管理争议
    'China university ban controversy site:reuters.com OR site:apnews.com',
    'Chinese campus food canteen protest site:scmp.com OR site:bbc.com',
    'China university dormitory management site:nytimes.com OR site:wsj.com',

    # 学术自由与意识形态
    'China university Western holiday ban site:reuters.com OR site:bbc.com',
    'Chinese academic freedom restriction site:nytimes.com OR site:theguardian.com',
    'China campus ideology control site:scmp.com OR site:ft.com',

    # 学生权益与校园安全
    'China student rights university site:reuters.com OR site:apnews.com',
    'Chinese campus safety incident site:bbc.com OR site:cnn.com',

    # 教师与学术事件
    'China professor academic scandal site:reuters.com OR site:scmp.com',
    'Chinese university teacher controversy site:bbc.com OR site:nytimes.com',

    # 招生与教育公平
    'China university admission fairness site:reuters.com OR site:scmp.com',
    'Chinese college enrollment policy site:apnews.com OR site:ft.com',

    # 社交平台热点（X/Twitter/Reddit）
    'China university controversy site:reddit.com',
    'Chinese campus ban Twitter',

    # 中文关键词
    '中国高校 舆情 site:scmp.com',
    '中国大学 争议 site:reuters.com',

    # 女权/LGBTQ/宗教渗透高校
    'China university feminism LGBT site:reuters.com OR site:bbc.com',
    'Chinese campus religious freedom site:nytimes.com OR site:wsj.com',
]

def log(msg):
    ts = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    line = f'[{ts}] {msg}'
    print(line, flush=True)
    os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
    with open(LOG_FILE, 'a', encoding='utf-8') as f:
        f.write(line + '\n')

def search_searxng(query, timeout=15):
    """通过 SearXNG 搜索"""
    try:
        params = {
            'q': query,
            'format': 'json',
            'language': 'zh',
            'time_range': 'week',  # 最近一周
        }
        r = requests.get(SEARXNG_URL, params=params, timeout=timeout)
        if r.status_code == 200:
            data = r.json()
            results = []
            for item in data.get('results', [])[:10]:
                results.append({
                    'title': item.get('title', ''),
                    'url': item.get('url', ''),
                    'content': item.get('content', '')[:500],
                    'engine': item.get('engine', 'unknown'),
                    'publishedDate': item.get('publishedDate', ''),
                })
            return results
    except Exception as e:
        log(f'SearXNG 搜索失败 [{query[:40]}]: {e}')
    return []

def main():
    log('========== 高校舆情采集启动 ==========')

    date_str = datetime.now().strftime('%Y%m%d')
    hour_str = datetime.now().strftime('%H%M')
    output_file = os.path.join(HOURLY_DIR, f'{date_str}_{hour_str}.json')
    os.makedirs(HOURLY_DIR, exist_ok=True)

    all_results = []

    for i, q in enumerate(QUERIES):
        log(f'[{i+1}/{len(QUERIES)}] 采集：{q[:60]}...')
        results = search_searxng(q)
        if results:
            all_results.append({
                'query': q,
                'timestamp': datetime.now().isoformat(),
                'items': results,
            })
            log(f'  ✓ 获取 {len(results)} 条结果')
        else:
            log(f'  - 无结果')

        # 请求间隔，避免被封
        if i < len(QUERIES) - 1:
            time.sleep(2)

    # 去重
    seen_urls = set()
    unique_items = []
    for group in all_results:
        for item in group.get('items', []):
            url = item.get('url', '')
            if url and url not in seen_urls:
                seen_urls.add(url)
                unique_items.append(item)

    output = {
        'timestamp': datetime.now().isoformat(),
        'query_count': len(all_results),
        'total_results': len(unique_items),
        'groups': all_results,
        'unique_items': unique_items,
    }

    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(output, f, ensure_ascii=False, indent=2)

    log(f'采集完成：{len(all_results)} 个查询，{len(unique_items)} 条唯一结果')
    log(f'保存至：{output_file}')
    log('========== 采集任务完成 ==========')

    return output_file

if __name__ == '__main__':
    main()
