"""
设备类型API路由
"""
from typing import List, Optional, Dict, Any
from fastapi import APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from app.core.deps import get_sync_db, get_current_user
from app.schemas.device_type import (
    DeviceTypeCreate,
    DeviceTypeUpdate,
    DeviceTypeResponse,
    DeviceTypeWithFields,
    DeviceTypeFieldCreate,
    DeviceTypeFieldUpdate,
    DeviceTypeFieldResponse
)
from app.services.device_type_service import device_type_service
from app.utils.redis_client import redis_client

router = APIRouter()


# 异步缓存包装器
@redis_client.cached_async("device_types:list", expire=1800)  # 缓存30分钟
async def _cached_get_device_types(
    skip: int,
    limit: int,
    category: Optional[str],
    status: Optional[str],
    keyword: Optional[str],
    db: Session
):
    """获取设备类型列表的缓存包装器"""
    items, total = device_type_service.get_device_types(
        db=db,
        skip=skip,
        limit=limit,
        category=category,
        status=status,
        keyword=keyword
    )
    return {"items": items, "total": total}


@redis_client.cached_async("device_types:categories", expire=1800)  # 缓存30分钟
async def _cached_get_device_type_categories(db: Session):
    """获取所有设备分类的缓存包装器"""
    return device_type_service.get_all_categories(db)


@router.get("/", response_model=Dict[str, Any])
async def get_device_types(
    skip: int = Query(0, ge=0, description="跳过条数"),
    limit: int = Query(20, ge=1, le=100, description="返回条数"),
    category: Optional[str] = Query(None, description="设备分类"),
    status: Optional[str] = Query(None, description="状态"),
    keyword: Optional[str] = Query(None, description="搜索关键词"),
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    获取设备类型列表（已启用缓存，30分钟）

    - **skip**: 跳过条数
    - **limit**: 返回条数（最大100）
    - **category**: 设备分类筛选
    - **status**: 状态筛选（active/inactive）
    - **keyword**: 搜索关键词（代码或名称）
    """
    return await _cached_get_device_types(
        skip=skip,
        limit=limit,
        category=category,
        status=status,
        keyword=keyword,
        db=db
    )


@router.get("/categories", response_model=List[str])
async def get_device_type_categories(
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    获取所有设备分类（已启用缓存，30分钟）

    返回所有使用中的设备分类列表
    """
    return await _cached_get_device_type_categories(db)


@router.get("/{device_type_id}", response_model=DeviceTypeWithFields)
def get_device_type(
    device_type_id: int,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    获取设备类型详情

    - **device_type_id**: 设备类型ID

    返回设备类型详情及其字段列表
    """
    return device_type_service.get_device_type(db, device_type_id, include_fields=True)


@router.post("/", response_model=DeviceTypeResponse, status_code=status.HTTP_201_CREATED)
def create_device_type(
    obj_in: DeviceTypeCreate,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    创建设备类型

    - **type_code**: 设备类型代码（唯一）
    - **type_name**: 设备类型名称
    - **category**: 设备分类
    - **description**: 描述
    - **icon**: 图标名称
    - **sort_order**: 排序
    """
    return device_type_service.create_device_type(
        db=db,
        obj_in=obj_in,
        creator_id=current_user.id
    )


@router.put("/{device_type_id}", response_model=DeviceTypeResponse)
def update_device_type(
    device_type_id: int,
    obj_in: DeviceTypeUpdate,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    更新设备类型

    - **device_type_id**: 设备类型ID
    - **type_name**: 设备类型名称
    - **category**: 设备分类
    - **description**: 描述
    - **icon**: 图标名称
    - **status**: 状态
    - **sort_order**: 排序
    """
    return device_type_service.update_device_type(
        db=db,
        device_type_id=device_type_id,
        obj_in=obj_in,
        updater_id=current_user.id
    )


@router.delete("/{device_type_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_device_type(
    device_type_id: int,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    删除设备类型

    - **device_type_id**: 设备类型ID

    软删除设备类型及其所有字段
    """
    device_type_service.delete_device_type(
        db=db,
        device_type_id=device_type_id,
        deleter_id=current_user.id
    )
    return None


# ===== 字段管理 =====

@router.get("/{device_type_id}/fields", response_model=List[DeviceTypeFieldResponse])
def get_device_type_fields(
    device_type_id: int,
    status: Optional[str] = Query(None, description="状态筛选"),
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    获取设备类型的字段列表

    - **device_type_id**: 设备类型ID
    - **status**: 状态筛选（active/inactive）

    返回指定设备类型的所有字段定义
    """
    return device_type_service.get_device_type_fields(db, device_type_id, status)


@router.post("/{device_type_id}/fields", response_model=DeviceTypeFieldResponse, status_code=status.HTTP_201_CREATED)
def create_device_type_field(
    device_type_id: int,
    obj_in: DeviceTypeFieldCreate,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    创建设备类型字段

    - **device_type_id**: 设备类型ID
    - **field_code**: 字段代码（在同一设备类型下唯一）
    - **field_name**: 字段名称
    - **field_type**: 字段类型（text/number/date/select/multiselect/boolean/textarea）
    - **is_required**: 是否必填
    - **default_value**: 默认值
    - **options**: 选项列表（用于select/multiselect类型）
    - **validation_rules**: 验证规则
    - **placeholder**: 占位符
    - **help_text**: 帮助文本
    - **sort_order**: 排序
    """
    return device_type_service.create_device_type_field(
        db=db,
        device_type_id=device_type_id,
        obj_in=obj_in,
        creator_id=current_user.id
    )


@router.put("/fields/{field_id}", response_model=DeviceTypeFieldResponse)
def update_device_type_field(
    field_id: int,
    obj_in: DeviceTypeFieldUpdate,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    更新设备类型字段

    - **field_id**: 字段ID
    - **field_name**: 字段名称
    - **field_type**: 字段类型
    - **is_required**: 是否必填
    - **default_value**: 默认值
    - **options**: 选项列表
    - **validation_rules**: 验证规则
    - **placeholder**: 占位符
    - **help_text**: 帮助文本
    - **status**: 状态
    - **sort_order**: 排序
    """
    return device_type_service.update_device_type_field(
        db=db,
        field_id=field_id,
        obj_in=obj_in,
        updater_id=current_user.id
    )


@router.delete("/fields/{field_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_device_type_field(
    field_id: int,
    db: Session = Depends(get_sync_db),
    current_user = Depends(get_current_user)
):
    """
    删除设备类型字段

    - **field_id**: 字段ID

    软删除字段
    """
    device_type_service.delete_device_type_field(
        db=db,
        field_id=field_id,
        deleter_id=current_user.id
    )
    return None
