"""
监控和审计相关的Pydantic模式定义
"""

from datetime import datetime
from typing import List, Optional, Dict, Any
from decimal import Decimal
from pydantic import BaseModel, Field, validator


# ============= 性能监控相关模式 =============

class PerformanceMetricResponse(BaseModel):
    """性能指标响应"""
    id: int
    request_id: str
    endpoint: str
    method: str
    response_time_ms: int
    db_query_time_ms: Optional[int]
    db_query_count: int
    memory_usage_mb: Optional[Decimal]
    cpu_usage_percent: Optional[Decimal]
    request_size_bytes: Optional[int]
    response_size_bytes: Optional[int]
    user_agent: Optional[str]
    client_ip: Optional[str]
    status_code: int
    is_error: bool
    error_message: Optional[str]
    timestamp: datetime
    created_at: datetime

    class Config:
        from_attributes = True


class PerformanceStatsResponse(BaseModel):
    """性能统计响应"""
    avg_response_time: float
    median_response_time: float
    p95_response_time: float
    p99_response_time: float
    error_rate: float
    throughput: float
    total_requests: int


class SystemMetricResponse(BaseModel):
    """系统指标响应"""
    id: int
    cpu_usage_percent: Optional[Decimal]
    memory_usage_mb: Optional[Decimal]
    memory_total_mb: Optional[Decimal]
    disk_usage_gb: Optional[Decimal]
    disk_total_gb: Optional[Decimal]
    db_connections_active: Optional[int]
    db_connections_total: Optional[int]
    db_pool_size: Optional[int]
    db_query_avg_time_ms: Optional[Decimal]
    orders_processed_count: Optional[int]
    api_requests_count: Optional[int]
    error_count: Optional[int]
    active_users_count: Optional[int]
    metric_type: str
    time_window_start: Optional[datetime]
    time_window_end: Optional[datetime]
    timestamp: datetime
    created_at: datetime

    class Config:
        from_attributes = True


class SystemStatsResponse(BaseModel):
    """系统统计响应"""
    cpu_usage: float
    memory_usage: float
    memory_total: float
    disk_usage: float
    disk_total: float
    db_connections: int
    active_users: int


class EndpointPerformanceResponse(BaseModel):
    """端点性能响应"""
    endpoint: str
    avg_response_time: float
    max_response_time: int
    request_count: int
    error_count: int
    error_rate: float


class PerformanceTrendResponse(BaseModel):
    """性能趋势响应"""
    timestamp: str
    avg_response_time: float
    request_count: int
    error_count: int
    error_rate: float


class PerformanceQueryRequest(BaseModel):
    """性能查询请求"""
    endpoint: Optional[str] = None
    start_time: Optional[datetime] = None
    end_time: Optional[datetime] = None
    limit: int = Field(1000, ge=1, le=10000)


# ============= 审计日志相关模式 =============

class AuditLogResponse(BaseModel):
    """审计日志响应"""
    id: int
    session_id: Optional[str]
    request_id: Optional[str]
    user_id: Optional[str]
    user_name: Optional[str]
    action: str
    resource_type: str
    resource_id: Optional[str]
    endpoint: str
    method: str
    description: Optional[str]
    old_values: Optional[Dict[str, Any]]
    new_values: Optional[Dict[str, Any]]
    request_data: Optional[Dict[str, Any]]
    status: str
    status_code: int
    error_message: Optional[str]
    client_ip: Optional[str]
    user_agent: Optional[str]
    referer: Optional[str]
    business_category: Optional[str]
    severity: str
    tags: Optional[str]
    timestamp: datetime
    created_at: datetime

    class Config:
        from_attributes = True


class AuditLogQueryRequest(BaseModel):
    """审计日志查询请求"""
    user_id: Optional[str] = None
    action: Optional[str] = None
    resource_type: Optional[str] = None
    business_category: Optional[str] = None
    severity: Optional[str] = None
    start_time: Optional[datetime] = None
    end_time: Optional[datetime] = None
    page: int = Field(1, ge=1)
    page_size: int = Field(50, ge=1, le=200)
    order_by: str = Field("timestamp", description="排序字段")
    order_desc: bool = Field(True, description="是否降序")


class AuditSummaryResponse(BaseModel):
    """审计摘要响应"""
    total_events: int
    action_breakdown: Dict[str, int]
    severity_breakdown: Dict[str, int]
    user_breakdown: Dict[str, int]
    resource_breakdown: Dict[str, int]
    error_count: int
    success_rate: float


class UserActivityResponse(BaseModel):
    """用户活动响应"""
    user_id: str
    user_name: str
    total_actions: int
    last_activity: datetime
    action_breakdown: Dict[str, int]
    risk_score: float


class SecurityEventResponse(BaseModel):
    """安全事件响应"""
    id: int
    timestamp: datetime
    action: str
    user_id: Optional[str]
    user_name: Optional[str]
    client_ip: Optional[str]
    severity: str
    description: Optional[str]
    status: str

    class Config:
        from_attributes = True


class AuditLogCreateRequest(BaseModel):
    """审计日志创建请求"""
    user_id: Optional[str] = None
    user_name: Optional[str] = None
    action: str = Field(..., description="操作类型")
    resource_type: str = Field(..., description="资源类型")
    resource_id: Optional[str] = None
    endpoint: str = Field(..., description="API端点")
    method: str = Field(..., description="HTTP方法")
    description: Optional[str] = None
    old_values: Optional[Dict[str, Any]] = None
    new_values: Optional[Dict[str, Any]] = None
    request_data: Optional[Dict[str, Any]] = None
    client_ip: Optional[str] = None
    business_category: Optional[str] = None
    severity: str = Field("info", description="严重级别")
    tags: Optional[List[str]] = None


class LogSearchRequest(BaseModel):
    """日志搜索请求"""
    search_term: str = Field(..., min_length=1, description="搜索关键词")
    search_fields: List[str] = Field(
        default=["description", "user_name", "endpoint", "resource_type"],
        description="搜索字段"
    )
    start_time: Optional[datetime] = None
    end_time: Optional[datetime] = None
    limit: int = Field(100, ge=1, le=1000)


class LogExportRequest(BaseModel):
    """日志导出请求"""
    start_time: datetime = Field(..., description="开始时间")
    end_time: datetime = Field(..., description="结束时间")
    format: str = Field("json", pattern="^(json|csv|xlsx)$", description="导出格式")
    user_id: Optional[str] = None
    include_sensitive_data: bool = Field(False, description="是否包含敏感数据")


# ============= 告警相关模式 =============

class AlertRuleCreate(BaseModel):
    """创建告警规则请求"""
    name: str = Field(..., max_length=255, description="规则名称")
    description: Optional[str] = Field(None, description="描述")
    category: str = Field(..., description="分类")
    metric_type: str = Field(..., description="监控指标类型")
    condition: str = Field(..., pattern="^(>|>=|<|<=|=)$", description="条件")
    threshold_value: Decimal = Field(..., description="阈值")
    time_window_minutes: int = Field(5, ge=1, le=1440, description="时间窗口(分钟)")
    severity: str = Field("warning", pattern="^(low|warning|high|critical)$", description="严重级别")
    notification_channels: Optional[str] = Field(None, description="通知渠道")
    cooldown_minutes: int = Field(30, ge=1, le=1440, description="冷却期(分钟)")
    is_enabled: bool = Field(True, description="是否启用")


class AlertRuleUpdate(BaseModel):
    """更新告警规则请求"""
    name: Optional[str] = Field(None, max_length=255, description="规则名称")
    description: Optional[str] = Field(None, description="描述")
    condition: Optional[str] = Field(None, pattern="^(>|>=|<|<=|=)$", description="条件")
    threshold_value: Optional[Decimal] = Field(None, description="阈值")
    time_window_minutes: Optional[int] = Field(None, ge=1, le=1440, description="时间窗口")
    severity: Optional[str] = Field(None, pattern="^(low|warning|high|critical)$", description="严重级别")
    notification_channels: Optional[str] = Field(None, description="通知渠道")
    cooldown_minutes: Optional[int] = Field(None, ge=1, le=1440, description="冷却期")
    is_enabled: Optional[bool] = Field(None, description="是否启用")


class AlertRuleResponse(BaseModel):
    """告警规则响应"""
    id: int
    name: str
    description: Optional[str]
    category: str
    metric_type: str
    condition: str
    threshold_value: Decimal
    time_window_minutes: int
    severity: str
    notification_channels: Optional[str]
    cooldown_minutes: int
    is_enabled: bool
    last_triggered_at: Optional[datetime]
    trigger_count: int
    created_at: datetime
    updated_at: datetime
    created_by: Optional[str]

    class Config:
        from_attributes = True


class AlertInstanceResponse(BaseModel):
    """告警实例响应"""
    id: int
    alert_rule_id: int
    rule_name: str
    metric_value: Decimal
    threshold_value: Decimal
    severity: str
    title: str
    message: str
    context_data: Optional[Dict[str, Any]]
    status: str
    acknowledged: bool
    acknowledged_by: Optional[str]
    acknowledged_at: Optional[datetime]
    notification_sent: bool
    notification_channels: Optional[str]
    triggered_at: datetime
    resolved_at: Optional[datetime]
    created_at: datetime

    class Config:
        from_attributes = True


class AlertInstanceAcknowledgeRequest(BaseModel):
    """告警确认请求"""
    acknowledged_by: str = Field(..., description="确认人")
    notes: Optional[str] = Field(None, description="确认备注")


class DashboardSummaryResponse(BaseModel):
    """仪表盘摘要响应"""
    system_stats: SystemStatsResponse
    performance_stats: PerformanceStatsResponse
    recent_alerts: List[AlertInstanceResponse]
    audit_summary: AuditSummaryResponse
    top_endpoints: List[EndpointPerformanceResponse]


# ============= 通用响应模式 =============

class MonitoringPaginatedResponse(BaseModel):
    """监控分页响应基类"""
    items: List[Any]
    total: int
    page: int
    page_size: int
    total_pages: int

    @validator('total_pages', pre=True, always=True)
    def calculate_total_pages(cls, v, values):
        total = values.get('total', 0)
        page_size = values.get('page_size', 1)
        return (total + page_size - 1) // page_size if page_size > 0 else 0


class MonitoringOperationResult(BaseModel):
    """监控操作结果"""
    success: bool
    message: str
    data: Optional[Dict[str, Any]] = None


class CleanupResult(BaseModel):
    """清理结果"""
    deleted_records: int
    operation_time: str
    details: Optional[Dict[str, Any]] = None