"""
测试v2.2新闻功能 - 完整流程测试
"""
import os
import sys
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 添加项目路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from app import create_app
from models import db, Site, News
from utils.news_searcher import NewsSearcher

def test_news_feature():
    """测试新闻功能"""
    print("=" * 60)
    print("v2.2 新闻功能测试")
    print("=" * 60)

    # 创建应用上下文
    app = create_app('development')

    with app.app_context():
        # 1. 测试API配置
        print("\n[1/4] 检查API配置...")
        api_key = app.config.get('BOCHA_API_KEY')
        if not api_key:
            print(">>> 错误：BOCHA_API_KEY未配置")
            return False
        print(f">>> API Key: {api_key[:20]}...")

        # 2. 测试数据库连接
        print("\n[2/4] 检查数据库...")
        try:
            site_count = Site.query.filter_by(is_active=True).count()
            print(f">>> 找到 {site_count} 个启用的网站")

            if site_count == 0:
                print(">>> 警告：没有可用的网站")
                return False

        except Exception as e:
            print(f">>> 数据库错误：{e}")
            return False

        # 3. 测试新闻搜索
        print("\n[3/4] 测试新闻搜索...")
        searcher = NewsSearcher(api_key)

        # 获取第一个网站
        site = Site.query.filter_by(is_active=True).first()
        print(f">>> 测试网站：{site.name}")

        try:
            news_items = searcher.search_site_news(
                site_name=site.name,
                site_url=site.url,
                count=3,
                freshness='oneWeek'
            )

            print(f">>> 找到 {len(news_items)} 条新闻")

            if news_items:
                print("\n新闻列表：")
                for i, item in enumerate(news_items, 1):
                    print(f"  {i}. {item['title'][:50]}...")
                    print(f"     来源：{item.get('site_name', '未知')}")
                    print(f"     URL：{item['url'][:60]}...")

        except Exception as e:
            print(f">>> 搜索失败：{e}")
            return False

        # 4. 测试保存到数据库
        print(f"\n[4/4] 测试保存到数据库...")

        if not news_items:
            print(">>> 没有新闻可保存")
            return True

        try:
            saved_count = 0
            for item in news_items[:2]:  # 只保存前2条作为测试
                # 检查是否已存在
                existing = News.query.filter_by(
                    site_id=site.id,
                    url=item['url']
                ).first()

                if not existing:
                    news = News(
                        site_id=site.id,
                        title=item['title'],
                        content=item.get('summary') or item.get('snippet', ''),
                        url=item['url'],
                        source_name=item.get('site_name', ''),
                        source_icon=item.get('site_icon', ''),
                        published_at=item.get('published_at'),
                        news_type='Search Result',
                        is_active=True
                    )
                    db.session.add(news)
                    saved_count += 1

            db.session.commit()
            print(f">>> 成功保存 {saved_count} 条新闻")

            # 验证保存
            total_news = News.query.filter_by(site_id=site.id).count()
            print(f">>> 该网站共有 {total_news} 条新闻记录")

        except Exception as e:
            db.session.rollback()
            print(f">>> 保存失败：{e}")
            return False

        print("\n" + "=" * 60)
        print(">>> 所有测试通过！")
        print("=" * 60)

        # 提供下一步建议
        print("\n下一步操作：")
        print(f"1. 访问网站详情页查看新闻：http://localhost:5000/site/{site.code}")
        print(f"2. 访问后台新闻管理：http://localhost:5000/admin/newsadmin/")
        print(f"3. 运行定期任务脚本：python fetch_news_cron.py --limit 5")

        return True

if __name__ == '__main__':
    try:
        success = test_news_feature()
        sys.exit(0 if success else 1)
    except Exception as e:
        print(f"\n严重错误：{e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)
