package models

import (
	"database/sql/driver"
	"errors"
	"time"

	"git.huangwc.com/pig/pig-farm-controller/internal/infra/notify"
	"go.uber.org/zap/zapcore"
	"gorm.io/gorm"
)

// NotificationStatus 定义了通知发送尝试的状态枚举。
type NotificationStatus string

const (
	NotificationStatusSuccess NotificationStatus = "发送成功" // 通知已成功发送
	NotificationStatusFailed  NotificationStatus = "发送失败" // 通知发送失败
	NotificationStatusSkipped NotificationStatus = "已跳过"  // 通知因某些原因被跳过（例如：用户未配置联系方式）
)

// LogLevel is a custom type for zapcore.Level to handle database scanning and valuing.
type LogLevel zapcore.Level

// Scan implements the sql.Scanner interface.
func (l *LogLevel) Scan(value interface{}) error {
	var s string
	switch v := value.(type) {
	case []byte:
		s = string(v)
	case string:
		s = v
	default:
		return errors.New("LogLevel的类型无效")
	}

	var zl zapcore.Level
	if err := zl.UnmarshalText([]byte(s)); err != nil {
		return err
	}
	*l = LogLevel(zl)
	return nil
}

// Value implements the driver.Valuer interface.
func (l LogLevel) Value() (driver.Value, error) {
	return (zapcore.Level)(l).String(), nil
}

// Notification 表示已发送或尝试发送的通知记录。
type Notification struct {
	gorm.Model

	// NotifierType 通知器类型 (例如："邮件", "企业微信", "飞书", "日志")
	NotifierType notify.NotifierType `gorm:"type:varchar(20);not null;index" json:"notifier_type"`
	// UserID 接收通知的用户ID，用于追溯通知记录到特定用户
	UserID uint `gorm:"index" json:"user_id"` // 增加 UserID 字段，并添加索引
	// Title 通知标题
	Title string `gorm:"type:varchar(255);not null" json:"title"`
	// Message 通知内容
	Message string `gorm:"type:text;not null" json:"message"`
	// Level 通知级别 (例如：INFO, WARN, ERROR)
	Level LogLevel `gorm:"type:varchar(10);not null" json:"level"`
	// AlarmTimestamp 通知内容生成时的时间戳，与 ID 构成复合主键
	AlarmTimestamp time.Time `gorm:"primaryKey;not null" json:"alarm_timestamp"`
	// ToAddress 接收地址 (例如：邮箱地址, 企业微信ID, 日志标识符)
	ToAddress string `gorm:"type:varchar(255);not null" json:"to_address"`
	// Status 通知发送尝试的状态 (例如："待发送", "发送成功", "发送失败", "已跳过")
	Status NotificationStatus `gorm:"type:varchar(20);not null;default:'待发送'" json:"status"`
	// ErrorMessage 如果通知发送失败，此字段存储错误信息
	ErrorMessage string `gorm:"type:text" json:"error_message"`
}

// TableName 指定 Notification 模型的表名。
func (Notification) TableName() string {
	return "notifications"
}
