import type { StatusVariantMap, StatusClassNameMap } from "@/shared/components/ui/status-badge"

export type AuditLogStatus = "success" | "failure"

export type LoginLogAction = "signin" | "signout" | "signup"
export type LoginLogStatus = "success" | "failure"

export type DataChangeAction = "create" | "update" | "delete"

/** 审计日志/登录日志 success/failure 状态 → Badge variant 映射 */
export const AUDIT_STATUS_VARIANT: StatusVariantMap<AuditLogStatus> = {
  success: "default",
  failure: "destructive",
}

/** 审计日志/登录日志 success/failure 状态 → 附加 className 映射 */
export const AUDIT_STATUS_CLASS_NAME: StatusClassNameMap<AuditLogStatus> = {
  success: "bg-green-600 hover:bg-green-700 border-transparent",
}

/** 数据变更 create/update/delete 动作 → Badge variant 映射 */
export const DATA_CHANGE_ACTION_VARIANT: StatusVariantMap<DataChangeAction> = {
  create: "default",
  update: "secondary",
  delete: "destructive",
}

/** 数据变更 create/update/delete 动作 → 附加 className 映射 */
export const DATA_CHANGE_ACTION_CLASS_NAME: StatusClassNameMap<DataChangeAction> = {
  create: "bg-green-600 hover:bg-green-700 border-transparent",
  delete: "bg-red-600 hover:bg-red-700 border-transparent",
}

/**
 * 审计日志保留天数常量。
 *
 * 定义在 types.ts（而非 retention.ts）以便客户端组件直接导入，
 * 避免 "use client" 组件经 retention.ts 间接拉入 mysql2 / server-only 依赖。
 */
/** 默认保留天数 */
export const DEFAULT_RETENTION_DAYS = 180

/** audit-P2-5: 登录日志默认保留天数（1 年，比审计日志更长以支持安全取证） */
export const DEFAULT_LOGIN_LOG_RETENTION_DAYS = 365

/** 最小保留天数（防止误设为 0 导致全量删除） */
export const MIN_RETENTION_DAYS = 30

/** 最大保留天数 */
export const MAX_RETENTION_DAYS = 3650

export interface AuditLog {
  id: string
  userId: string
  userName: string
  action: string
  module: string
  targetId: string | null
  targetType: string | null
  detail: string | null
  ipAddress: string | null
  userAgent: string | null
  status: AuditLogStatus
  createdAt: string
}

export interface LoginLog {
  id: string
  userId: string | null
  userEmail: string
  action: LoginLogAction
  status: LoginLogStatus
  ipAddress: string | null
  userAgent: string | null
  errorMessage: string | null
  createdAt: string
}

export interface DataChangeLog {
  id: string
  tableName: string
  recordId: string
  action: DataChangeAction
  oldValue: string | null
  newValue: string | null
  changedBy: string
  changedByName: string
  ipAddress: string | null
  createdAt: string
}

export interface DataChangeStat {
  tableName: string
  count: number
}

export interface AuditLogQueryParams {
  userId?: string
  module?: string
  action?: string
  status?: AuditLogStatus
  page?: number
  pageSize?: number
  startDate?: string
  endDate?: string
}

export interface LoginLogQueryParams {
  userId?: string
  action?: LoginLogAction
  status?: LoginLogStatus
  page?: number
  pageSize?: number
  startDate?: string
  endDate?: string
}

export interface DataChangeLogQueryParams {
  tableName?: string
  recordId?: string
  action?: DataChangeAction
  userId?: string
  page?: number
  pageSize?: number
  startDate?: string
  endDate?: string
}

export interface PaginatedResult<T> {
  items: T[]
  total: number
  page: number
  pageSize: number
  totalPages: number
}

/** 审计概览统计（今日数据） */
export interface AuditOverviewStats {
  /** 今日审计事件数 */
  auditEventsToday: number
  /** 今日失败登录数 */
  failedLoginsToday: number
  /** 今日数据变更数 */
  dataChangesToday: number
  /** 审计日志总数 */
  totalAuditLogs: number
}

/** 审计活动趋势数据点 */
export interface AuditTrendPoint {
  /** 日期（YYYY-MM-DD） */
  date: string
  /** 当日审计事件数 */
  auditEvents: number
  /** 当日登录事件数 */
  loginEvents: number
  /** 当日数据变更数 */
  dataChanges: number
}

/** 数据变更按动作统计 */
export interface DataChangeActionStat {
  action: DataChangeAction
  count: number
}

/** 审计日志保留策略配置 */
export interface AuditRetentionConfig {
  /** 保留天数（90/180/365 等） */
  retentionDays: number
  /** 登录日志保留天数（audit-P2-5 新增：login_logs 默认 365 天，比审计日志更长以支持安全取证） */
  loginLogRetentionDays: number
  /** 是否启用自动清理 */
  autoCleanupEnabled: boolean
}

/** 保留策略清理结果 */
export interface PurgeResult {
  /** 清理的审计日志数 */
  auditLogsDeleted: number
  /** 清理的登录日志数 */
  loginLogsDeleted: number
  /** 清理的数据变更日志数 */
  dataChangeLogsDeleted: number
}
