from fastapi import APIRouter, Request, Query, Path, Body
from typing import Any, List, Dict, Union
from app.services.tjnetwork import (
    Any,
    ChangeSet,
    add_pattern,
    delete_pattern,
    get_pattern,
    get_pattern_schema,
    get_patterns,
    is_pattern,
    set_pattern,
)

router = APIRouter()

@router.get("/getpatternschema", summary="获取模式架构", description="获取网络中模式对象的架构定义")
async def fastapi_get_pattern_schema(network: str = Query(..., description="管网名称（或数据库名称）")) -> dict[str, dict[str, Any]]:
    """获取模式架构。
    
    返回指定网络中模式对象的属性架构定义。
    """
    return get_pattern_schema(network)

@router.post("/addpattern/", response_model=None, summary="添加模式", description="在网络中添加一个新的模式")
async def fastapi_add_pattern(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    pattern: str = Query(..., description="模式ID"),
    req: Request = None
) -> ChangeSet:
    """添加模式。
    
    在指定网络中创建一个新的模式，并设置其初始属性。
    """
    props = await req.json()
    ps = {
        "id": pattern,
    } | props
    return add_pattern(network, ChangeSet(ps))

@router.post("/deletepattern/", response_model=None, summary="删除模式", description="从网络中删除指定的模式")
async def fastapi_delete_pattern(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    pattern: str = Query(..., description="模式ID")
) -> ChangeSet:
    """删除模式。
    
    从指定网络中删除指定的模式及其相关数据。
    """
    ps = {"id": pattern}
    return delete_pattern(network, ChangeSet(ps))

@router.get("/getpatternproperties/", summary="获取模式属性", description="获取指定模式的属性信息")
async def fastapi_get_pattern_properties(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    pattern: str = Query(..., description="模式ID")
) -> dict[str, Any]:
    """获取模式属性。
    
    返回指定模式的所有属性信息。
    """
    return get_pattern(network, pattern)

@router.post("/setpatternproperties/", response_model=None, summary="设置模式属性", description="更新指定模式的属性")
async def fastapi_set_pattern_properties(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    pattern: str = Query(..., description="模式ID"),
    req: Request = None
) -> ChangeSet:
    """设置模式属性。
    
    更新指定模式的属性值。
    """
    props = await req.json()
    ps = {"id": pattern} | props
    return set_pattern(network, ChangeSet(ps))

@router.get("/ispattern/", summary="检查模式存在性", description="检查指定的模式是否存在")
async def fastapi_is_pattern(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    pattern: str = Query(..., description="模式ID")
) -> bool:
    """检查模式是否存在。
    
    判断指定的模式是否在网络中存在。
    """
    return is_pattern(network, pattern)

@router.get("/getpatterns/", summary="获取所有模式", description="获取网络中的所有模式列表")
async def fastapi_get_patterns(network: str = Query(..., description="管网名称（或数据库名称）")) -> list[str]:
    """获取所有模式。
    
    返回指定网络中的所有模式ID列表。
    """
    return get_patterns(network)
