"""
搜索 API 接口
提供全局搜索功能，支持搜索题目和部署记录
"""

from flask import Blueprint, request, jsonify, g
from app.models.database.models import ChallengeRecord, DeploymentRecord, db
from sqlalchemy import or_

bp_search = Blueprint('search', __name__, url_prefix='/api/search')


@bp_search.route('', methods=['GET'])
def search():
    """
    全局搜索接口
    
    Query Parameters:
        q: 搜索关键词
        type: 搜索类型 (all, challenges, deployments)，默认 all
        limit: 返回结果数量限制，默认 10
    
    Returns:
        JSON: 搜索结果
    """
    # 获取搜索参数
    query = request.args.get('q', '').strip()
    search_type = request.args.get('type', 'all')
    limit = min(int(request.args.get('limit', 10)), 50)  # 最多50条
    
    if not query:
        return jsonify({
            'success': True,
            'results': [],
            'total': 0
        })
    
    if len(query) < 1:
        return jsonify({
            'success': True,
            'results': [],
            'total': 0
        })
    
    results = []
    
    # 获取当前用户ID（如果已登录）
    user_id = g.user.id if hasattr(g, 'user') and g.user else None
    is_admin = hasattr(g, 'user') and g.user and g.user.role == 'admin'
    
    # 搜索题目
    if search_type in ['all', 'challenges']:
        challenge_results = search_challenges(query, user_id, is_admin, limit)
        results.extend(challenge_results)
    
    # 搜索部署
    if search_type in ['all', 'deployments']:
        deployment_results = search_deployments(query, user_id, is_admin, limit)
        results.extend(deployment_results)
    
    # 按相关性排序（名称完全匹配优先）
    results.sort(key=lambda x: (
        0 if query.lower() in x.get('name', '').lower() else 1,
        x.get('type', ''),
        x.get('name', '')
    ))
    
    # 限制总结果数
    results = results[:limit]
    
    return jsonify({
        'success': True,
        'results': results,
        'total': len(results),
        'query': query
    })


def search_challenges(query, user_id, is_admin, limit):
    """搜索题目记录"""
    results = []
    
    try:
        # 构建查询
        base_query = ChallengeRecord.query.filter(
            or_(
                ChallengeRecord.name.ilike(f'%{query}%'),
                ChallengeRecord.description.ilike(f'%{query}%')
            )
        )
        
        # 非管理员只能搜索自己的题目
        if not is_admin and user_id:
            base_query = base_query.filter(ChallengeRecord.user_id == user_id)
        elif not is_admin and not user_id:
            # 未登录用户不能搜索题目
            return []
        
        # 按创建时间倒序
        challenges = base_query.order_by(ChallengeRecord.created_at.desc()).limit(limit).all()
        
        for challenge in challenges:
            results.append({
                'type': 'challenge',
                'id': challenge.id,
                'name': challenge.name,
                'description': challenge.description[:100] + '...' if challenge.description and len(challenge.description) > 100 else challenge.description,
                'url': f'/generate/?challenge_id={challenge.id}',
                'icon': 'fa-flag',
                'created_at': challenge.created_at.strftime('%Y-%m-%d %H:%M') if challenge.created_at else None
            })
    except Exception as e:
        print(f"搜索题目出错: {e}")
    
    return results


def search_deployments(query, user_id, is_admin, limit):
    """搜索部署记录"""
    results = []
    
    try:
        # 构建查询
        base_query = DeploymentRecord.query.filter(
            or_(
                DeploymentRecord.container_name.ilike(f'%{query}%'),
                DeploymentRecord.deployment_uuid.ilike(f'%{query}%')
            )
        )
        
        # 非管理员只能搜索自己的部署
        if not is_admin and user_id:
            base_query = base_query.filter(DeploymentRecord.user_id == user_id)
        elif not is_admin and not user_id:
            # 未登录用户不能搜索部署
            return []
        
        # 按创建时间倒序
        deployments = base_query.order_by(DeploymentRecord.created_at.desc()).limit(limit).all()
        
        for deployment in deployments:
            # 获取关联的题目名称
            challenge_name = ''
            if deployment.challenge:
                challenge_name = deployment.challenge.name
            
            status_icon = {
                'running': 'fa-play-circle',
                'stopped': 'fa-stop-circle',
                'error': 'fa-exclamation-circle',
                'creating': 'fa-spinner'
            }.get(deployment.status, 'fa-docker')
            
            results.append({
                'type': 'deployment',
                'id': deployment.deployment_uuid,
                'name': deployment.container_name or f'部署 {deployment.deployment_uuid[:8]}',
                'description': f'{challenge_name} - {deployment.status}' if challenge_name else deployment.status,
                'url': f'/deployment/view/{deployment.deployment_uuid}',
                'icon': status_icon,
                'status': deployment.status,
                'created_at': deployment.created_at.strftime('%Y-%m-%d %H:%M') if deployment.created_at else None
            })
    except Exception as e:
        print(f"搜索部署出错: {e}")
    
    return results
