#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：security_erp_task.py
模块描述：安全测试 ERP 任务创建 API 路由，提供任务创建预览和创建接口
          参考实现：ApiSecurityTest/utils/task_creator.py + report_parser.py

作者：czj
创建日期：2026-08-17
最后修改：2026-08-17
"""

import logging

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession

from app.database import get_db
from app.schemas.security_erp_task import (
    TaskPreviewResponse,
    CreateTaskRequest,
    CreateTaskResponse,
)
from app.services.security_erp_task_service import SecurityErpTaskService

logger = logging.getLogger(__name__)

router = APIRouter()


@router.get(
    "/executions/{execution_id}/task-preview",
    response_model=TaskPreviewResponse,
    summary="获取安全测试ERP任务创建预览",
)
async def get_task_preview(
    execution_id: str,
    db: AsyncSession = Depends(get_db),
):
    """
    获取安全测试 ERP 任务创建预览数据

    在创建任务前调用，返回：
    - 报告摘要（测试目标、时间、漏洞统计）
    - 自动生成的任务名称
    - 自动计算的紧急程度
    - ERP 基础数据（任务类型列表、状态列表、人员列表）
    - 搜索到的关联需求
    - 默认任务配置

    前端基于此数据展示对话框，允许用户修改参数后创建任务。
    """
    try:
        service = SecurityErpTaskService(db)
        preview = await service.get_task_preview(execution_id)
        return preview
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))
    except Exception as e:
        logger.error(f"获取任务预览失败: {e}")
        raise HTTPException(status_code=500, detail=f"获取任务预览失败: {str(e)}")


@router.post(
    "/executions/{execution_id}/create-task",
    response_model=CreateTaskResponse,
    summary="创建安全测试ERP任务",
)
async def create_task(
    execution_id: str,
    request: CreateTaskRequest,
    db: AsyncSession = Depends(get_db),
):
    """
    创建安全测试 ERP 任务

    基于已生成的报告，构建任务数据并调用 ERP 接口创建任务。
    支持自定义任务参数（类型、状态、责任人、紧急程度、截止时间等）。

    Args:
        execution_id: 安全测试执行 ID
        request: 任务配置参数

    Returns:
        CreateTaskResponse: 创建结果
    """
    try:
        service = SecurityErpTaskService(db)
        result = await service.create_task(
            execution_id=execution_id,
            config=request.model_dump(),
        )
        return result
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))
    except Exception as e:
        logger.error(f"创建 ERP 任务失败: {e}")
        raise HTTPException(status_code=500, detail=f"创建 ERP 任务失败: {str(e)}")