from fastapi import APIRouter, Request, Query, Path, Body
from typing import Any, List, Dict, Union
from app.services.tjnetwork import (
    Any,
    ChangeSet,
    add_mixing,
    add_source,
    api,
    delete_mixing,
    delete_source,
    get_emitter,
    get_emitter_schema,
    get_mixing,
    get_mixing_schema,
    get_pipe_reaction,
    get_pipe_reaction_schema,
    get_quality,
    get_quality_schema,
    get_reaction,
    get_reaction_schema,
    get_source,
    get_source_schema,
    get_tank_reaction,
    get_tank_reaction_schema,
    set_emitter,
    set_pipe_reaction,
    set_quality,
    set_reaction,
    set_source,
    set_tank_reaction,
)

router = APIRouter()

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

@router.get("/getqualityproperties/", summary="获取水质属性", description="获取指定节点的水质属性信息")
async def fastapi_get_quality_properties(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    node: str = Query(..., description="节点ID")
) -> dict[str, Any]:
    """获取水质属性。
    
    返回指定节点的水质属性信息。
    """
    return get_quality(network, node)

@router.post("/setqualityproperties/", response_model=None, summary="设置水质属性", description="更新指定节点的水质属性")
async def fastapi_set_quality_properties(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """设置水质属性。
    
    更新指定节点的水质属性值。
    """
    props = await req.json()
    return set_quality(network, ChangeSet(props))

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

@router.get("/getemitterproperties/", summary="获取发射器属性", description="获取指定连接点的发射器属性信息")
async def fastapi_get_emitter_properties(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    junction: str = Query(..., description="连接点ID")
) -> dict[str, Any]:
    """获取发射器属性。
    
    返回指定连接点的发射器属性信息。
    """
    return get_emitter(network, junction)

@router.post("/setemitterproperties/", response_model=None, summary="设置发射器属性", description="更新指定连接点的发射器属性")
async def fastapi_set_emitter_properties(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    junction: str = Query(..., description="连接点ID"),
    req: Request = None
) -> ChangeSet:
    """设置发射器属性。
    
    更新指定连接点的发射器属性值。
    """
    props = await req.json()
    ps = {"junction": junction} | props
    return set_emitter(network, ChangeSet(ps))

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

@router.get("/getsource/", summary="获取水源属性", description="获取指定节点的水源属性信息")
async def fastapi_get_source(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    node: str = Query(..., description="节点ID")
) -> dict[str, Any]:
    """获取水源属性。
    
    返回指定节点的水源属性信息。
    """
    return get_source(network, node)

@router.post("/setsource/", response_model=None, summary="设置水源属性", description="更新指定节点的水源属性")
async def fastapi_set_source(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """设置水源属性。
    
    更新指定节点的水源属性值。
    """
    props = await req.json()
    return set_source(network, ChangeSet(props))

@router.post("/addsource/", response_model=None, summary="添加水源", description="在网络中添加一个新的水源")
async def fastapi_add_source(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """添加水源。
    
    在指定网络中创建一个新的水源，并设置其初始属性。
    """
    props = await req.json()
    return add_source(network, ChangeSet(props))

@router.post("/deletesource/", response_model=None, summary="删除水源", description="从网络中删除指定节点的水源")
async def fastapi_delete_source(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    node: str = Query(..., description="节点ID")
) -> ChangeSet:
    """删除水源。
    
    从指定网络中删除指定节点的水源。
    """
    props = {"node": node}
    return delete_source(network, ChangeSet(props))

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

@router.get("/getreaction/", summary="获取反应属性", description="获取指定网络中的反应属性信息")
async def fastapi_get_reaction(network: str = Query(..., description="管网名称（或数据库名称）")) -> dict[str, Any]:
    """获取反应属性。
    
    返回指定网络中的反应属性信息。
    """
    return get_reaction(network)

@router.post("/setreaction/", response_model=None, summary="设置反应属性", description="更新指定网络中的反应属性")
async def fastapi_set_reaction(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """设置反应属性。
    
    更新指定网络中的反应属性值。
    """
    props = await req.json()
    return set_reaction(network, ChangeSet(props))

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

@router.get("/getpipereaction/", summary="获取管道反应属性", description="获取指定管道的反应属性信息")
async def fastapi_get_pipe_reaction(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    pipe: str = Query(..., description="管道ID")
) -> dict[str, Any]:
    """获取管道反应属性。
    
    返回指定管道的反应属性信息。
    """
    return get_pipe_reaction(network, pipe)

@router.post("/setpipereaction/", response_model=None, summary="设置管道反应属性", description="更新指定管道的反应属性")
async def fastapi_set_pipe_reaction(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """设置管道反应属性。
    
    更新指定管道的反应属性值。
    """
    props = await req.json()
    return set_pipe_reaction(network, ChangeSet(props))

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

@router.get("/gettankreaction/", summary="获取水池反应属性", description="获取指定水池的反应属性信息")
async def fastapi_get_tank_reaction(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    tank: str = Query(..., description="水池ID")
) -> dict[str, Any]:
    """获取水池反应属性。
    
    返回指定水池的反应属性信息。
    """
    return get_tank_reaction(network, tank)

@router.post("/settankreaction/", response_model=None, summary="设置水池反应属性", description="更新指定水池的反应属性")
async def fastapi_set_tank_reaction(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """设置水池反应属性。
    
    更新指定水池的反应属性值。
    """
    props = await req.json()
    return set_tank_reaction(network, ChangeSet(props))

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

@router.get("/getmixing/", summary="获取混合属性", description="获取指定水池的混合属性信息")
async def fastapi_get_mixing(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    tank: str = Query(..., description="水池ID")
) -> dict[str, Any]:
    """获取混合属性。
    
    返回指定水池的混合属性信息。
    """
    return get_mixing(network, tank)

@router.post("/setmixing/", response_model=None, summary="设置混合属性", description="更新指定水池的混合属性")
async def fastapi_set_mixing(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """设置混合属性。
    
    更新指定水池的混合属性值。
    """
    props = await req.json()
    return api.set_mixing(network, ChangeSet(props))

@router.post("/addmixing/", response_model=None, summary="添加混合", description="在网络中添加一个新的混合")
async def fastapi_add_mixing(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """添加混合。
    
    在指定网络中创建一个新的混合，并设置其初始属性。
    """
    props = await req.json()
    return add_mixing(network, ChangeSet(props))

@router.post("/deletemixing/", response_model=None, summary="删除混合", description="从网络中删除指定的混合")
async def fastapi_delete_mixing(
    network: str = Query(..., description="管网名称（或数据库名称）"),
    req: Request = None
) -> ChangeSet:
    """删除混合。
    
    从指定网络中删除指定的混合及其相关数据。
    """
    props = await req.json()
    return delete_mixing(network, ChangeSet(props))
