"""
工作流模板服务
提供预设的工作流模板，支持快速创建
"""
from typing import Dict, Any, List
import logging

logger = logging.getLogger(__name__)


# 预设工作流模板
WORKFLOW_TEMPLATES = {
    "simple_llm": {
        "name": "简单LLM工作流",
        "description": "一个简单的LLM调用工作流，包含开始、LLM和结束节点",
        "nodes": [
            {
                "id": "start-1",
                "type": "start",
                "position": {"x": 100, "y": 100},
                "data": {"label": "开始"}
            },
            {
                "id": "llm-1",
                "type": "llm",
                "position": {"x": 100, "y": 250},
                "data": {
                    "label": "LLM处理",
                    "prompt": "请处理以下输入：\n{input}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo",
                    "temperature": 0.7
                }
            },
            {
                "id": "end-1",
                "type": "end",
                "position": {"x": 100, "y": 400},
                "data": {"label": "结束"}
            }
        ],
        "edges": [
            {
                "id": "e1",
                "source": "start-1",
                "target": "llm-1",
                "sourceHandle": "bottom",
                "targetHandle": "top"
            },
            {
                "id": "e2",
                "source": "llm-1",
                "target": "end-1",
                "sourceHandle": "bottom",
                "targetHandle": "top"
            }
        ]
    },
    "conditional_llm": {
        "name": "条件判断LLM工作流",
        "description": "根据条件判断调用不同的LLM处理",
        "nodes": [
            {
                "id": "start-1",
                "type": "start",
                "position": {"x": 100, "y": 100},
                "data": {"label": "开始"}
            },
            {
                "id": "condition-1",
                "type": "condition",
                "position": {"x": 100, "y": 200},
                "data": {
                    "label": "条件判断",
                    "condition": "{value} > 10"
                }
            },
            {
                "id": "llm-true",
                "type": "llm",
                "position": {"x": -100, "y": 350},
                "data": {
                    "label": "True分支LLM",
                    "prompt": "值大于10，请分析：{input}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo"
                }
            },
            {
                "id": "llm-false",
                "type": "llm",
                "position": {"x": 300, "y": 350},
                "data": {
                    "label": "False分支LLM",
                    "prompt": "值小于等于10，请分析：{input}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo"
                }
            },
            {
                "id": "end-1",
                "type": "end",
                "position": {"x": 100, "y": 500},
                "data": {"label": "结束"}
            }
        ],
        "edges": [
            {
                "id": "e1",
                "source": "start-1",
                "target": "condition-1"
            },
            {
                "id": "e2",
                "source": "condition-1",
                "target": "llm-true",
                "sourceHandle": "true"
            },
            {
                "id": "e3",
                "source": "condition-1",
                "target": "llm-false",
                "sourceHandle": "false"
            },
            {
                "id": "e4",
                "source": "llm-true",
                "target": "end-1"
            },
            {
                "id": "e5",
                "source": "llm-false",
                "target": "end-1"
            }
        ]
    },
    "data_transform_llm": {
        "name": "数据转换+LLM工作流",
        "description": "先进行数据转换，再调用LLM处理",
        "nodes": [
            {
                "id": "start-1",
                "type": "start",
                "position": {"x": 100, "y": 100},
                "data": {"label": "开始"}
            },
            {
                "id": "transform-1",
                "type": "transform",
                "position": {"x": 100, "y": 200},
                "data": {
                    "label": "数据转换",
                    "mode": "mapping",
                    "mapping": {
                        "input_text": "raw_input",
                        "user_id": "id"
                    }
                }
            },
            {
                "id": "llm-1",
                "type": "llm",
                "position": {"x": 100, "y": 300},
                "data": {
                    "label": "LLM处理",
                    "prompt": "处理转换后的数据：{input_text}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo"
                }
            },
            {
                "id": "end-1",
                "type": "end",
                "position": {"x": 100, "y": 400},
                "data": {"label": "结束"}
            }
        ],
        "edges": [
            {
                "id": "e1",
                "source": "start-1",
                "target": "transform-1"
            },
            {
                "id": "e2",
                "source": "transform-1",
                "target": "llm-1"
            },
            {
                "id": "e3",
                "source": "llm-1",
                "target": "end-1"
            }
        ]
    },
    "multi_llm_chain": {
        "name": "多LLM链式工作流",
        "description": "多个LLM节点链式调用，实现复杂处理流程",
        "nodes": [
            {
                "id": "start-1",
                "type": "start",
                "position": {"x": 100, "y": 100},
                "data": {"label": "开始"}
            },
            {
                "id": "llm-1",
                "type": "llm",
                "position": {"x": 100, "y": 200},
                "data": {
                    "label": "第一步分析",
                    "prompt": "第一步：分析输入数据：{input}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo"
                }
            },
            {
                "id": "llm-2",
                "type": "llm",
                "position": {"x": 100, "y": 300},
                "data": {
                    "label": "第二步处理",
                    "prompt": "第二步：基于第一步的结果进行处理：{input}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo"
                }
            },
            {
                "id": "llm-3",
                "type": "llm",
                "position": {"x": 100, "y": 400},
                "data": {
                    "label": "第三步总结",
                    "prompt": "第三步：总结最终结果：{input}",
                    "provider": "openai",
                    "model": "gpt-3.5-turbo"
                }
            },
            {
                "id": "end-1",
                "type": "end",
                "position": {"x": 100, "y": 500},
                "data": {"label": "结束"}
            }
        ],
        "edges": [
            {
                "id": "e1",
                "source": "start-1",
                "target": "llm-1"
            },
            {
                "id": "e2",
                "source": "llm-1",
                "target": "llm-2"
            },
            {
                "id": "e3",
                "source": "llm-2",
                "target": "llm-3"
            },
            {
                "id": "e4",
                "source": "llm-3",
                "target": "end-1"
            }
        ]
    }
}


def get_template(template_id: str) -> Dict[str, Any]:
    """
    获取工作流模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        模板数据
    """
    return WORKFLOW_TEMPLATES.get(template_id)


def list_templates() -> List[Dict[str, Any]]:
    """
    获取所有模板列表
    
    Returns:
        模板列表，每个模板包含id、name、description
    """
    return [
        {
            "id": template_id,
            "name": template["name"],
            "description": template["description"]
        }
        for template_id, template in WORKFLOW_TEMPLATES.items()
    ]


def create_from_template(template_id: str, name: str = None, description: str = None) -> Dict[str, Any]:
    """
    从模板创建工作流数据
    
    Args:
        template_id: 模板ID
        name: 工作流名称（可选，默认使用模板名称）
        description: 工作流描述（可选，默认使用模板描述）
        
    Returns:
        工作流数据
    """
    template = get_template(template_id)
    if not template:
        raise ValueError(f"模板不存在: {template_id}")
    
    return {
        "name": name or template["name"],
        "description": description or template["description"],
        "nodes": template["nodes"],
        "edges": template["edges"]
    }
