"""
性能监控和审计日志数据模型
"""

from datetime import datetime
from typing import Optional, Dict, Any
import json

from sqlalchemy import Column, Integer, String, DateTime, DECIMAL as SQLDecimal, Text, Boolean, Index, JSON
from sqlalchemy.sql import func

from app.core.database import Base


class PerformanceMetric(Base):
    """性能指标记录"""
    __tablename__ = "performance_metrics"

    id = Column(Integer, primary_key=True, index=True)
    
    # 请求信息
    request_id = Column(String(36), nullable=False, index=True)  # UUID
    endpoint = Column(String(255), nullable=False, index=True)  # API端点
    method = Column(String(10), nullable=False)  # HTTP方法
    
    # 性能指标
    response_time_ms = Column(Integer, nullable=False)  # 响应时间(毫秒)
    db_query_time_ms = Column(Integer, nullable=True)  # 数据库查询时间
    db_query_count = Column(Integer, nullable=True, default=0)  # 查询次数
    memory_usage_mb = Column(SQLDecimal(10, 2), nullable=True)  # 内存使用量(MB)
    cpu_usage_percent = Column(SQLDecimal(5, 2), nullable=True)  # CPU使用率
    
    # 请求详情
    request_size_bytes = Column(Integer, nullable=True)  # 请求体大小
    response_size_bytes = Column(Integer, nullable=True)  # 响应体大小
    user_agent = Column(Text, nullable=True)  # 用户代理
    client_ip = Column(String(45), nullable=True)  # 客户端IP
    
    # 状态
    status_code = Column(Integer, nullable=False)  # HTTP状态码
    is_error = Column(Boolean, nullable=False, default=False)  # 是否错误
    error_message = Column(Text, nullable=True)  # 错误信息
    
    # 时间戳
    timestamp = Column(DateTime, nullable=False, default=datetime.utcnow)
    created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    
    # 索引
    __table_args__ = (
        Index('idx_perf_endpoint_timestamp', 'endpoint', 'timestamp'),
        Index('idx_perf_timestamp', 'timestamp'),
        Index('idx_perf_response_time', 'response_time_ms'),
        Index('idx_perf_status_error', 'status_code', 'is_error'),
    )


class AuditLog(Base):
    """审计日志记录"""
    __tablename__ = "audit_logs"

    id = Column(Integer, primary_key=True, index=True)
    
    # 基本信息
    session_id = Column(String(64), nullable=True, index=True)  # 会话ID
    request_id = Column(String(36), nullable=True, index=True)  # 关联的请求ID
    user_id = Column(String(255), nullable=True, index=True)  # 用户ID
    user_name = Column(String(255), nullable=True)  # 用户名
    
    # 操作信息
    action = Column(String(100), nullable=False, index=True)  # 操作类型
    resource_type = Column(String(100), nullable=False, index=True)  # 资源类型
    resource_id = Column(String(255), nullable=True, index=True)  # 资源ID
    endpoint = Column(String(255), nullable=False)  # API端点
    method = Column(String(10), nullable=False)  # HTTP方法
    
    # 详细信息
    description = Column(String(500), nullable=True)  # 操作描述
    old_values = Column(JSON, nullable=True)  # 修改前的值
    new_values = Column(JSON, nullable=True)  # 修改后的值
    request_data = Column(JSON, nullable=True)  # 请求数据
    
    # 结果信息
    status = Column(String(50), nullable=False, default="success")  # success, failed, error
    status_code = Column(Integer, nullable=False)  # HTTP状态码
    error_message = Column(Text, nullable=True)  # 错误信息
    
    # 环境信息
    client_ip = Column(String(45), nullable=True)  # 客户端IP
    user_agent = Column(Text, nullable=True)  # 用户代理
    referer = Column(String(500), nullable=True)  # 来源页面
    
    # 业务相关
    business_category = Column(String(100), nullable=True, index=True)  # 业务分类
    severity = Column(String(20), nullable=False, default="info")  # low, info, warning, high, critical
    tags = Column(String(500), nullable=True)  # 标签（逗号分隔）
    
    # 时间戳
    timestamp = Column(DateTime, nullable=False, default=datetime.utcnow)
    created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    
    # 索引
    __table_args__ = (
        Index('idx_audit_action_resource', 'action', 'resource_type'),
        Index('idx_audit_user_timestamp', 'user_id', 'timestamp'),
        Index('idx_audit_timestamp', 'timestamp'),
        Index('idx_audit_status', 'status'),
        Index('idx_audit_severity', 'severity'),
        Index('idx_audit_business_category', 'business_category'),
    )


class SystemMetric(Base):
    """系统指标记录"""
    __tablename__ = "system_metrics"

    id = Column(Integer, primary_key=True, index=True)
    
    # 系统资源指标
    cpu_usage_percent = Column(SQLDecimal(5, 2), nullable=True)  # CPU使用率
    memory_usage_mb = Column(SQLDecimal(10, 2), nullable=True)  # 内存使用量
    memory_total_mb = Column(SQLDecimal(10, 2), nullable=True)  # 总内存
    disk_usage_gb = Column(SQLDecimal(12, 2), nullable=True)  # 磁盘使用量
    disk_total_gb = Column(SQLDecimal(12, 2), nullable=True)  # 总磁盘空间
    
    # 数据库指标
    db_connections_active = Column(Integer, nullable=True)  # 活跃数据库连接
    db_connections_total = Column(Integer, nullable=True)  # 总数据库连接
    db_pool_size = Column(Integer, nullable=True)  # 连接池大小
    db_query_avg_time_ms = Column(SQLDecimal(10, 2), nullable=True)  # 平均查询时间
    
    # 业务指标
    orders_processed_count = Column(Integer, nullable=True, default=0)  # 处理的订单数
    api_requests_count = Column(Integer, nullable=True, default=0)  # API请求数
    error_count = Column(Integer, nullable=True, default=0)  # 错误数
    active_users_count = Column(Integer, nullable=True, default=0)  # 活跃用户数
    
    # 时间窗口
    metric_type = Column(String(50), nullable=False, default="realtime")  # realtime, hourly, daily
    time_window_start = Column(DateTime, nullable=True)  # 时间窗口开始
    time_window_end = Column(DateTime, nullable=True)  # 时间窗口结束
    
    # 时间戳
    timestamp = Column(DateTime, nullable=False, default=datetime.utcnow)
    created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    
    # 索引
    __table_args__ = (
        Index('idx_system_metric_type_timestamp', 'metric_type', 'timestamp'),
        Index('idx_system_timestamp', 'timestamp'),
        Index('idx_system_time_window', 'time_window_start', 'time_window_end'),
    )


class AlertRule(Base):
    """告警规则配置"""
    __tablename__ = "alert_rules"

    id = Column(Integer, primary_key=True, index=True)
    
    # 规则基本信息
    name = Column(String(255), nullable=False, index=True)  # 规则名称
    description = Column(Text, nullable=True)  # 描述
    category = Column(String(100), nullable=False, index=True)  # 分类
    
    # 规则配置
    metric_type = Column(String(100), nullable=False)  # 监控指标类型
    condition = Column(String(100), nullable=False)  # 条件: >, <, =, >=, <=
    threshold_value = Column(SQLDecimal(15, 4), nullable=False)  # 阈值
    time_window_minutes = Column(Integer, nullable=False, default=5)  # 时间窗口(分钟)
    
    # 告警配置
    severity = Column(String(20), nullable=False, default="warning")  # low, warning, high, critical
    notification_channels = Column(String(500), nullable=True)  # 通知渠道
    cooldown_minutes = Column(Integer, nullable=False, default=30)  # 冷却期(分钟)
    
    # 状态
    is_enabled = Column(Boolean, nullable=False, default=True)  # 是否启用
    last_triggered_at = Column(DateTime, nullable=True)  # 上次触发时间
    trigger_count = Column(Integer, nullable=False, default=0)  # 触发次数
    
    # 时间戳
    created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    updated_at = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
    created_by = Column(String(255), nullable=True)  # 创建人
    
    # 索引
    __table_args__ = (
        Index('idx_alert_category_enabled', 'category', 'is_enabled'),
        Index('idx_alert_metric_type', 'metric_type'),
        Index('idx_alert_severity', 'severity'),
    )


class AlertInstance(Base):
    """告警实例记录"""
    __tablename__ = "alert_instances"

    id = Column(Integer, primary_key=True, index=True)
    
    # 关联信息
    alert_rule_id = Column(Integer, nullable=False, index=True)  # 告警规则ID
    rule_name = Column(String(255), nullable=False)  # 规则名称(冗余存储)
    
    # 告警信息
    metric_value = Column(SQLDecimal(15, 4), nullable=False)  # 触发时的指标值
    threshold_value = Column(SQLDecimal(15, 4), nullable=False)  # 阈值
    severity = Column(String(20), nullable=False)  # 严重级别
    
    # 描述信息
    title = Column(String(500), nullable=False)  # 告警标题
    message = Column(Text, nullable=False)  # 告警消息
    context_data = Column(JSON, nullable=True)  # 上下文数据
    
    # 状态管理
    status = Column(String(50), nullable=False, default="active")  # active, resolved, suppressed
    acknowledged = Column(Boolean, nullable=False, default=False)  # 是否已确认
    acknowledged_by = Column(String(255), nullable=True)  # 确认人
    acknowledged_at = Column(DateTime, nullable=True)  # 确认时间
    
    # 通知状态
    notification_sent = Column(Boolean, nullable=False, default=False)  # 是否已发送通知
    notification_channels = Column(String(500), nullable=True)  # 通知渠道
    
    # 时间戳
    triggered_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    resolved_at = Column(DateTime, nullable=True)  # 解决时间
    created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    
    # 索引
    __table_args__ = (
        Index('idx_alert_instance_rule_status', 'alert_rule_id', 'status'),
        Index('idx_alert_instance_triggered_at', 'triggered_at'),
        Index('idx_alert_instance_severity', 'severity'),
        Index('idx_alert_instance_status', 'status'),
    )