package model

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
	"strconv"
	"strings"
)

type CBCEventStatus int

// CBCEventStatus CB事件状态枚举
const (
	CBCEventStatusNull CBCEventStatus = iota // 未知状态
	CBCEventStatusActive
	CBCEventStatusInactive
)

func (status CBCEventStatus) Enum() string {
	switch status {
	case CBCEventStatusNull:
		return "NULL"
	case CBCEventStatusActive:
		return "ACTIVE"
	case CBCEventStatusInactive:
		return "INACTIVE"
	default:
		return "UNKNOWN"
	}
}

func (status CBCEventStatus) String() string {
	return fmt.Sprintf("%d", status)
}

// ParseCBCEventStatus 将字符串转换为 枚举类型
func ParseCBCEventStatus(s string) CBCEventStatus {
	if i, err := strconv.Atoi(s); err == nil {
		return CBCEventStatus(i)
	}
	// 如果转换失败，则按名称匹配（忽略大小写）
	switch strings.ToUpper(s) {
	case "NULL":
		return CBCEventStatusNull
	case "ACTIVE":
		return CBCEventStatusActive
	case "INACTIVE":
		return CBCEventStatusInactive
	case "":
		// 如果字符串为空，则返回未知状态
		return CBCEventStatusNull
	default:
		// 默认返回未知状态
		return CBCEventStatusNull
	}
}

// CBCMessageQuery 查询条件结构体
type CBCMessageQuery struct {
	NeType    string `form:"neType"`    // 网元类型
	NeId      string `form:"neId"`      // 网元ID
	EventName string `form:"eventName"` // 事件名称
	Status    string `form:"status"`    // 消息状态
	StartTime string `form:"startTime"` // 创建时间范围-起始
	EndTime   string `form:"endTime"`   // 创建时间范围-结束
	PageNum   int    `form:"pageNum" binding:"required"`
	PageSize  int    `form:"pageSize" binding:"required"`
}

// @Description CBCMessage CB消息
type CBCMessage struct {
	Id          int64           `json:"id" gorm:"column:id"`                    // CB消息ID
	NeType      string          `json:"neType" gorm:"column:ne_type"`           // 网元类型
	NeId        string          `json:"neId" gorm:"column:ne_id"`               // 网元ID
	MessageJson json.RawMessage `json:"messageJson" gorm:"column:message_json"` // 消息内容JSON
	Status      CBCEventStatus  `json:"status" gorm:"column:status"`            // 消息状态
	Detail      string          `json:"detail" gorm:"column:detail"`            // 详情
	CreatedAt   int64           `json:"createdAt" gorm:"column:created_at"`     // 创建时间
	UpdatedAt   int64           `json:"updatedAt" gorm:"column:updated_at"`     // 更新时间
}

// TableName 表名称
func (*CBCMessage) TableName() string {
	return "cbc_message"
}

// Scan 实现 sql.Scanner 接口，支持从数据库字符串转为 CBCEventStatus
func (s *CBCEventStatus) Scan(value interface{}) error {
	switch v := value.(type) {
	case string:
		*s = ParseCBCEventStatus(v)
		return nil
	case []byte:
		*s = ParseCBCEventStatus(string(v))
		return nil
	case int64:
		*s = CBCEventStatus(v)
		return nil
	case int:
		*s = CBCEventStatus(v)
		return nil
	default:
		return errors.New("unsupported Scan type for CBCEventStatus")
	}
}

// Value 实现 driver.Valuer 接口，支持将 CBCEventStatus 存为字符串
func (s CBCEventStatus) Value() (driver.Value, error) {
	return s.Enum(), nil
}
