#!/usr/bin/env python3
"""
生成智能需求分析与解决方案生成Agent
这是一个复杂的多节点Agent，能够理解用户需求并生成专业的解决方案
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from sqlalchemy.orm import Session
from app.core.database import SessionLocal
from app.models.agent import Agent
from app.models.user import User
from app.models.node_template import NodeTemplate
from datetime import datetime
import uuid
import json


def generate_smart_agent(db: Session, username: str = "admin"):
    """生成智能需求分析与解决方案生成Agent"""
    print("=" * 60)
    print("生成智能需求分析与解决方案生成Agent")
    print("=" * 60)
    print()
    
    # 查找用户
    user = db.query(User).filter(User.username == username).first()
    if not user:
        print(f"❌ 未找到用户 '{username}'，请先创建该用户")
        return
    print(f"✅ 找到用户: {user.username} (ID: {user.id})")
    print()
    
    # 查找可用的节点模板（优先选择特定类型的模板）
    # 优先查找：工作流设计、API集成、数据分析、业务流程等类型的模板
    preferred_categories = ["工作流设计", "API集成", "数据分析", "业务流程", "技术方案"]
    
    templates = []
    for category in preferred_categories:
        category_templates = db.query(NodeTemplate).filter(
            ((NodeTemplate.is_public == True) | (NodeTemplate.user_id == user.id)) &
            (NodeTemplate.category == category)
        ).limit(2).all()
        templates.extend(category_templates)
    
    # 如果没找到足够的模板，补充其他公开模板
    if len(templates) < 3:
        other_templates = db.query(NodeTemplate).filter(
            (NodeTemplate.is_public == True) | (NodeTemplate.user_id == user.id)
        ).limit(5).all()
        for t in other_templates:
            if t not in templates:
                templates.append(t)
                if len(templates) >= 5:
                    break
    
    if len(templates) < 2:
        print(f"⚠️  警告: 只找到 {len(templates)} 个节点模板，将使用LLM节点代替")
        use_templates = False
    else:
        use_templates = True
        print(f"📋 找到 {len(templates)} 个可用节点模板")
        for i, template in enumerate(templates[:5], 1):
            print(f"   {i}. {template.name} ({template.category})")
        print()
    
    # 生成智能工作流配置
    # 工作流结构：
    # 开始 -> 需求理解 -> 需求分类 -> [技术方案分支 | 业务流程分支 | 数据分析分支] -> 方案整合 -> 输出优化 -> 结束
    
    nodes = []
    edges = []
    
    # 1. 开始节点
    start_node = {
        "id": "start-1",
        "type": "start",
        "position": {"x": 50, "y": 300},
        "data": {
            "label": "开始",
            "output_format": "json"
        }
    }
    nodes.append(start_node)
    
    # 2. 需求理解节点（LLM节点）
    requirement_analysis_node = {
        "id": "llm-requirement-analysis",
        "type": "llm",
        "position": {"x": 250, "y": 300},
        "data": {
            "label": "需求理解与分析",
            "provider": "deepseek",
            "model": "deepseek-chat",
            "temperature": "0.7",
            "max_tokens": "2000",
            "prompt": """你是一位专业的需求分析师。请分析用户的需求，并提取关键信息。

用户需求：{input}

请按照以下格式输出JSON：
{{
  "requirement_type": "技术方案|业务流程|数据分析|工作流设计|其他",
  "key_points": ["关键点1", "关键点2", ...],
  "complexity": "简单|中等|复杂",
  "domain": "领域（如：电商、金融、教育等）",
  "summary": "需求摘要"
}}"""
        }
    }
    nodes.append(requirement_analysis_node)
    edges.append({
        "id": "e1",
        "source": "start-1",
        "target": "llm-requirement-analysis"
    })
    
    # 3. 需求分类节点（条件节点）
    classification_node = {
        "id": "condition-classify",
        "type": "condition",
        "position": {"x": 450, "y": 300},
        "data": {
            "label": "需求分类",
            "condition": "{{requirement_type}} == '技术方案' or {{requirement_type}} == 'API集成'"
        }
    }
    nodes.append(classification_node)
    edges.append({
        "id": "e2",
        "source": "llm-requirement-analysis",
        "target": "condition-classify"
    })
    
    # 4. 技术方案分支（如果使用模板）
    if use_templates and len(templates) > 0:
        # 查找技术方案相关的模板
        tech_template = None
        for t in templates:
            if "技术" in t.category or "API" in t.category or "集成" in t.name:
                tech_template = t
                break
        if not tech_template:
            tech_template = templates[0]
        
        tech_solution_node = {
            "id": "template-tech-solution",
            "type": "template",
            "position": {"x": 650, "y": 200},
            "data": {
                "label": tech_template.name,
                "template_id": tech_template.id,
                "provider": tech_template.provider or "deepseek",
                "model": tech_template.model or "deepseek-chat",
                "temperature": str(tech_template.temperature) if tech_template.temperature else "0.7",
                "max_tokens": str(tech_template.max_tokens) if tech_template.max_tokens else "2000",
                "prompt": tech_template.prompt
            }
        }
        nodes.append(tech_solution_node)
        edges.append({
            "id": "e3",
            "source": "condition-classify",
            "target": "template-tech-solution",
            "sourceHandle": "true"
        })
    else:
        # 使用LLM节点代替
        tech_solution_node = {
            "id": "llm-tech-solution",
            "type": "llm",
            "position": {"x": 650, "y": 200},
            "data": {
                "label": "技术方案设计",
                "provider": "deepseek",
                "model": "deepseek-chat",
                "temperature": "0.7",
                "max_tokens": "3000",
                "prompt": """你是一位资深的技术架构师。根据需求分析结果，设计一个完整的技术方案。

需求分析结果：{{requirement_analysis}}

请提供：
1. 技术选型建议
2. 架构设计
3. 实施步骤
4. 风险评估
5. 最佳实践建议

输出格式：结构化的Markdown文档"""
            }
        }
        nodes.append(tech_solution_node)
        edges.append({
            "id": "e3",
            "source": "condition-classify",
            "target": "llm-tech-solution",
            "sourceHandle": "true"
        })
    
    # 5. 业务流程分支（优先使用LLM节点，确保能理解用户需求）
    # 使用LLM节点而不是模板节点，因为LLM节点可以更好地理解需求上下文
    process_solution_node = {
        "id": "llm-process-solution",
        "type": "llm",
        "position": {"x": 650, "y": 400},
        "data": {
            "label": "业务流程设计",
            "provider": "deepseek",
            "model": "deepseek-chat",
            "temperature": "0.7",
            "max_tokens": "4000",
            "prompt": """你是一位资深的业务流程设计专家。请根据用户的需求，设计一个完整、详细的业务流程方案。

**重要**：请仔细阅读用户原始需求，确保设计方案完全符合用户的具体需求。

用户原始需求：{{query}}

需求分析结果：{{requirement_analysis}}

请提供以下内容：
1. **流程概述**：整体流程的目标、范围和价值
2. **详细流程设计**：
   - 流程的各个阶段和环节
   - 每个环节的输入、输出和处理逻辑
   - 状态流转图（用Mermaid或文字描述）
3. **关键步骤说明**：
   - 每个步骤的具体操作
   - 前置条件和后置条件
   - 异常情况处理
4. **角色与职责**：
   - 涉及的角色/系统
   - 每个角色的职责和权限
5. **数据流转**：
   - 关键数据在各环节的流转
   - 数据格式和验证规则
6. **异常处理机制**：
   - 常见异常场景
   - 异常处理流程
7. **流程优化建议**：
   - 性能优化点
   - 用户体验优化
8. **实施路线图**：
   - 分阶段实施计划
   - 关键里程碑

**重要**：请确保设计方案完全符合用户的需求，不要偏离主题。如果用户需求是电商订单流程，就设计电商订单流程；如果是其他业务，就设计对应的业务流程。

输出格式：结构化的Markdown文档，使用清晰的标题和列表"""
        }
    }
    nodes.append(process_solution_node)
    edges.append({
        "id": "e4",
        "source": "condition-classify",
        "target": "llm-process-solution",
        "sourceHandle": "false"
    })
    
    # 6. 方案整合节点（Transform节点）
    integration_node = {
        "id": "transform-integration",
        "type": "transform",
        "position": {"x": 850, "y": 300},
        "data": {
            "label": "方案整合",
            "mode": "merge",
            "mapping": {
                "solution": "{{result}}",
                "requirement_analysis": "{{requirement_analysis}}",
                "query": "{{query}}",
                "timestamp": "{{timestamp}}"
            }
        }
    }
    nodes.append(integration_node)
    
    # 连接分支到整合节点
    if use_templates and len(templates) > 0:
        edges.append({
            "id": "e5",
            "source": "template-tech-solution" if use_templates else "llm-tech-solution",
            "target": "transform-integration"
        })
    else:
        edges.append({
            "id": "e5",
            "source": "llm-tech-solution",
            "target": "transform-integration"
        })
    
    # 业务流程分支始终使用LLM节点
    edges.append({
        "id": "e6",
        "source": "llm-process-solution",
        "target": "transform-integration"
    })
    
    # 7. 输出优化节点（LLM节点）
    optimization_node = {
        "id": "llm-optimization",
        "type": "llm",
        "position": {"x": 1050, "y": 300},
        "data": {
            "label": "输出优化与格式化",
            "provider": "deepseek",
            "model": "deepseek-chat",
            "temperature": "0.5",
            "max_tokens": "4000",
            "prompt": """你是一位专业的技术文档编辑。请对方案进行优化和格式化，确保方案完全符合用户需求。

用户原始需求：{{query}}
需求分析结果：{{requirement_analysis}}
整合后的方案：{{solution}}

**重要检查**：
1. 确保方案内容与用户需求完全匹配
2. 如果方案偏离了用户需求，请重新生成符合需求的方案
3. 如果方案是关于数据清洗的，但用户需求是业务流程设计，请重新生成业务流程设计方案

请：
1. 检查方案是否完全符合用户需求
2. 优化文档结构，使其更清晰
3. 补充关键细节和实施建议
4. 确保格式统一、专业
5. 如果发现方案不符合需求，请重新生成正确的方案

**输出要求**：
- 只输出纯文本的Markdown文档内容
- 不要包含任何JSON格式、代码块标记或其他格式包装
- 直接输出方案文档的正文内容
- 确保内容完整、专业、易读

输出格式：直接输出完整的Markdown文档正文（纯文本）"""
        }
    }
    nodes.append(optimization_node)
    edges.append({
        "id": "e7",
        "source": "transform-integration",
        "target": "llm-optimization"
    })
    
    # 8. 结束节点
    end_node = {
        "id": "end-1",
        "type": "end",
        "position": {"x": 1250, "y": 300},
        "data": {
            "label": "结束",
            "output_format": "text"  # 默认纯文本格式，适合对话场景
        }
    }
    nodes.append(end_node)
    edges.append({
        "id": "e8",
        "source": "llm-optimization",
        "target": "end-1"
    })
    
    # 检查是否已存在同名Agent
    agent_name = "智能需求分析与解决方案生成器"
    existing = db.query(Agent).filter(
        Agent.name == agent_name,
        Agent.user_id == user.id
    ).first()
    
    if existing:
        print(f"⚠️  Agent '{agent_name}' 已存在，将更新它...")
        existing.workflow_config = {"nodes": nodes, "edges": edges}
        existing.description = """智能需求分析与解决方案生成Agent

功能特点：
1. 自动理解用户需求并提取关键信息
2. 根据需求类型智能分类（技术方案/业务流程/数据分析等）
3. 调用专业模板或LLM生成针对性解决方案
4. 整合并优化输出，生成专业文档

适用场景：
- 技术方案设计
- 业务流程优化
- 系统架构设计
- 问题分析与解决"""
        existing.updated_at = datetime.now()
        agent = existing
    else:
        # 创建Agent
        agent = Agent(
            name=agent_name,
            description="""智能需求分析与解决方案生成Agent

功能特点：
1. 自动理解用户需求并提取关键信息
2. 根据需求类型智能分类（技术方案/业务流程/数据分析等）
3. 调用专业模板或LLM生成针对性解决方案
4. 整合并优化输出，生成专业文档

适用场景：
- 技术方案设计
- 业务流程优化
- 系统架构设计
- 问题分析与解决""",
            workflow_config={"nodes": nodes, "edges": edges},
            status="published",  # 直接发布，可以直接使用
            user_id=user.id,
            version=1
        )
        db.add(agent)
    
    try:
        db.commit()
        db.refresh(agent)
        print()
        print("=" * 60)
        print(f"✅ 成功创建/更新智能Agent: {agent.name}")
        print(f"   ID: {agent.id}")
        print(f"   状态: {agent.status}")
        print(f"   节点数量: {len(nodes)}")
        print(f"   连接数量: {len(edges)}")
        print("=" * 60)
        print()
        print("工作流结构:")
        print("  开始 -> 需求理解 -> 需求分类 -> [技术方案分支 | 业务流程分支] -> 方案整合 -> 输出优化 -> 结束")
        print()
        print("节点说明:")
        print("  1. 开始节点：接收用户输入")
        print("  2. 需求理解节点：分析用户需求，提取关键信息")
        print("  3. 需求分类节点：根据需求类型进行分支")
        print("  4. 技术方案/业务流程节点：生成针对性解决方案")
        print("  5. 方案整合节点：整合各分支结果")
        print("  6. 输出优化节点：优化和格式化最终输出")
        print("  7. 结束节点：返回最终结果")
        print()
        return agent
    except Exception as e:
        db.rollback()
        print()
        print("=" * 60)
        print(f"❌ 创建失败: {e}")
        print("=" * 60)
        import traceback
        traceback.print_exc()
        raise


if __name__ == "__main__":
    import argparse
    
    parser = argparse.ArgumentParser(description="生成智能需求分析与解决方案生成Agent")
    parser.add_argument(
        "--username",
        type=str,
        default="admin",
        help="创建Agent的用户名（默认: admin）"
    )
    
    args = parser.parse_args()
    
    db = SessionLocal()
    try:
        generate_smart_agent(db, username=args.username)
    except Exception as e:
        print(f"❌ 发生错误: {e}")
        import traceback
        traceback.print_exc()
    finally:
        db.close()
