package model

import (
	"time"
)

// PollingConfig 轮询配置表
type PollingConfig struct {
	ID                      uint      `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	ConfigName              string    `gorm:"column:config_name;type:varchar(100);not null;comment:配置名称" json:"config_name"`
	CardCondition           string    `gorm:"column:card_condition;type:varchar(50);comment:卡状态条件：not_real_name/real_name/activated/suspended" json:"card_condition"`
	CardCategory            string    `gorm:"column:card_category;type:varchar(50);comment:卡业务类型：normal/industry" json:"card_category"`
	CarrierID               *uint     `gorm:"column:carrier_id;comment:运营商ID（可选，精确匹配）" json:"carrier_id"`
	Priority                int       `gorm:"column:priority;not null;default:100;comment:优先级（数字越小优先级越高）" json:"priority"`
	RealnameCheckInterval   *int      `gorm:"column:realname_check_interval;comment:实名检查间隔（秒），NULL表示不检查" json:"realname_check_interval"`
	CarddataCheckInterval   *int      `gorm:"column:carddata_check_interval;comment:流量检查间隔（秒），NULL表示不检查" json:"carddata_check_interval"`
	PackageCheckInterval    *int      `gorm:"column:package_check_interval;comment:套餐检查间隔（秒），NULL表示不检查" json:"package_check_interval"`
	ProtectCheckInterval    *int      `gorm:"column:protect_check_interval;comment:保护期一致性检查间隔（秒），NULL=不参与" json:"protect_check_interval"`
	CardStatusCheckInterval *int      `gorm:"column:card_status_check_interval;comment:卡状态检查间隔（秒），NULL表示不启用卡状态轮询" json:"card_status_check_interval"`
	Status                  int16     `gorm:"column:status;type:smallint;not null;default:1;comment:状态：0-禁用，1-启用" json:"status"`
	Description             string    `gorm:"column:description;type:text;comment:配置说明" json:"description"`
	CreatedAt               time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"`
	UpdatedAt               time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"`
	CreatedBy               *uint     `gorm:"column:created_by;comment:创建人ID" json:"created_by"`
	UpdatedBy               *uint     `gorm:"column:updated_by;comment:更新人ID" json:"updated_by"`
}

// TableName 指定表名
func (PollingConfig) TableName() string {
	return "tb_polling_config"
}

// PollingConcurrencyConfig 并发控制配置表
type PollingConcurrencyConfig struct {
	ID             uint      `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	TaskType       string    `gorm:"column:task_type;type:varchar(50);uniqueIndex;not null;comment:任务类型：realname/carddata/package/stop_start" json:"task_type"`
	MaxConcurrency int       `gorm:"column:max_concurrency;not null;default:50;comment:最大并发数" json:"max_concurrency"`
	Description    string    `gorm:"column:description;type:text;comment:配置说明" json:"description"`
	CreatedAt      time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"`
	UpdatedAt      time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"`
	UpdatedBy      *uint     `gorm:"column:updated_by;comment:更新人ID" json:"updated_by"`
}

// TableName 指定表名
func (PollingConcurrencyConfig) TableName() string {
	return "tb_polling_concurrency_config"
}

// PollingAlertRule 告警规则表
type PollingAlertRule struct {
	ID                   uint      `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	RuleName             string    `gorm:"column:rule_name;type:varchar(100);not null;comment:规则名称" json:"rule_name"`
	TaskType             string    `gorm:"column:task_type;type:varchar(50);not null;comment:任务类型：realname/carddata/package" json:"task_type"`
	MetricType           string    `gorm:"column:metric_type;type:varchar(50);not null;comment:指标类型：queue_size/success_rate/avg_duration/concurrency" json:"metric_type"`
	Operator             string    `gorm:"column:operator;type:varchar(20);not null;comment:比较运算符：gt/lt/gte/lte/eq" json:"operator"`
	Threshold            float64   `gorm:"column:threshold;type:decimal(10,2);not null;comment:阈值" json:"threshold"`
	DurationMinutes      int       `gorm:"column:duration_minutes;not null;default:5;comment:持续时长（分钟），避免短暂波动" json:"duration_minutes"`
	AlertLevel           string    `gorm:"column:alert_level;type:varchar(20);not null;default:'warning';comment:告警级别：info/warning/error/critical" json:"alert_level"`
	NotificationChannels string    `gorm:"column:notification_channels;type:text;comment:通知渠道（JSON数组）：[\"email\",\"sms\",\"webhook\"]" json:"notification_channels"`
	NotificationConfig   string    `gorm:"column:notification_config;type:text;comment:通知配置（JSON）" json:"notification_config"`
	Status               int16     `gorm:"column:status;type:smallint;not null;default:1;comment:状态：0-禁用，1-启用" json:"status"`
	CooldownMinutes      int       `gorm:"column:cooldown_minutes;not null;default:5;comment:冷却期（分钟），避免重复告警" json:"cooldown_minutes"`
	Description          string    `gorm:"column:description;type:text;comment:规则说明" json:"description"`
	CreatedAt            time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"`
	UpdatedAt            time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"`
	CreatedBy            *uint     `gorm:"column:created_by;comment:创建人ID" json:"created_by"`
	UpdatedBy            *uint     `gorm:"column:updated_by;comment:更新人ID" json:"updated_by"`
}

// TableName 指定表名
func (PollingAlertRule) TableName() string {
	return "tb_polling_alert_rule"
}

// PollingAlertHistory 告警历史表
type PollingAlertHistory struct {
	ID                   uint      `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	RuleID               uint      `gorm:"column:rule_id;not null;comment:告警规则ID" json:"rule_id"`
	TaskType             string    `gorm:"column:task_type;type:varchar(50);not null;comment:任务类型" json:"task_type"`
	MetricType           string    `gorm:"column:metric_type;type:varchar(50);not null;comment:指标类型" json:"metric_type"`
	AlertLevel           string    `gorm:"column:alert_level;type:varchar(20);not null;comment:告警级别" json:"alert_level"`
	CurrentValue         float64   `gorm:"column:current_value;type:decimal(10,2);not null;comment:当前值" json:"current_value"`
	Threshold            float64   `gorm:"column:threshold;type:decimal(10,2);not null;comment:阈值" json:"threshold"`
	AlertMessage         string    `gorm:"column:alert_message;type:text;not null;comment:告警消息" json:"alert_message"`
	NotificationChannels string    `gorm:"column:notification_channels;type:text;comment:通知渠道（JSON数组）" json:"notification_channels"`
	NotificationStatus   string    `gorm:"column:notification_status;type:varchar(20);comment:通知状态：pending/sent/failed" json:"notification_status"`
	NotificationResult   string    `gorm:"column:notification_result;type:text;comment:通知结果（JSON）" json:"notification_result"`
	CreatedAt            time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:告警时间" json:"created_at"`
}

// TableName 指定表名
func (PollingAlertHistory) TableName() string {
	return "tb_polling_alert_history"
}

// DataCleanupConfig 数据清理配置表
type DataCleanupConfig struct {
	ID            uint      `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	TargetTable   string    `gorm:"column:table_name;type:varchar(100);uniqueIndex;not null;comment:表名" json:"table_name"`
	RetentionDays int       `gorm:"column:retention_days;not null;comment:保留天数" json:"retention_days"`
	Enabled       int16     `gorm:"column:enabled;type:smallint;not null;default:1;comment:是否启用：0-禁用，1-启用" json:"enabled"`
	BatchSize     int       `gorm:"column:batch_size;not null;default:10000;comment:每批删除条数" json:"batch_size"`
	Description   string    `gorm:"column:description;type:text;comment:配置说明" json:"description"`
	CreatedAt     time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"`
	UpdatedAt     time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"`
	UpdatedBy     *uint     `gorm:"column:updated_by;comment:更新人ID" json:"updated_by"`
}

// TableName 指定表名
func (DataCleanupConfig) TableName() string {
	return "tb_data_cleanup_config"
}

// DataCleanupLog 数据清理日志表
type DataCleanupLog struct {
	ID            uint       `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	TargetTable   string     `gorm:"column:table_name;type:varchar(100);not null;comment:表名" json:"table_name"`
	CleanupType   string     `gorm:"column:cleanup_type;type:varchar(50);not null;comment:清理类型：scheduled/manual" json:"cleanup_type"`
	RetentionDays int        `gorm:"column:retention_days;not null;comment:保留天数" json:"retention_days"`
	DeletedCount  int64      `gorm:"column:deleted_count;not null;default:0;comment:删除记录数" json:"deleted_count"`
	DurationMs    int64      `gorm:"column:duration_ms;not null;default:0;comment:执行耗时（毫秒）" json:"duration_ms"`
	Status        string     `gorm:"column:status;type:varchar(20);not null;comment:状态：success/failed/running" json:"status"`
	ErrorMessage  string     `gorm:"column:error_message;type:text;comment:错误信息" json:"error_message"`
	StartedAt     time.Time  `gorm:"column:started_at;not null;comment:开始时间" json:"started_at"`
	CompletedAt   *time.Time `gorm:"column:completed_at;comment:完成时间" json:"completed_at"`
	TriggeredBy   *uint      `gorm:"column:triggered_by;comment:触发人ID（手动触发时）" json:"triggered_by"`
}

// TableName 指定表名
func (DataCleanupLog) TableName() string {
	return "tb_data_cleanup_log"
}

// PollingManualTriggerLog 手动触发日志表
type PollingManualTriggerLog struct {
	ID              uint       `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	TaskType        string     `gorm:"column:task_type;type:varchar(50);not null;comment:任务类型：realname/carddata/package" json:"task_type"`
	TriggerType     string     `gorm:"column:trigger_type;type:varchar(50);not null;comment:触发类型：single/batch/by_condition" json:"trigger_type"`
	CardIDs         string     `gorm:"column:card_ids;type:text;comment:卡ID列表（JSON数组）" json:"card_ids"`
	ConditionFilter string     `gorm:"column:condition_filter;type:text;comment:筛选条件（JSON）" json:"condition_filter"`
	TotalCount      int        `gorm:"column:total_count;not null;default:0;comment:总卡数" json:"total_count"`
	ProcessedCount  int        `gorm:"column:processed_count;not null;default:0;comment:已处理数" json:"processed_count"`
	SuccessCount    int        `gorm:"column:success_count;not null;default:0;comment:成功数" json:"success_count"`
	FailedCount     int        `gorm:"column:failed_count;not null;default:0;comment:失败数" json:"failed_count"`
	Status          string     `gorm:"column:status;type:varchar(20);not null;comment:状态：pending/processing/completed/cancelled" json:"status"`
	TriggeredBy     uint       `gorm:"column:triggered_by;not null;comment:触发人ID" json:"triggered_by"`
	TriggeredAt     time.Time  `gorm:"column:triggered_at;not null;default:CURRENT_TIMESTAMP;comment:触发时间" json:"triggered_at"`
	CompletedAt     *time.Time `gorm:"column:completed_at;comment:完成时间" json:"completed_at"`
}

// TableName 指定表名
func (PollingManualTriggerLog) TableName() string {
	return "tb_polling_manual_trigger_log"
}
