package store

import (
	"time"

	"github.com/bwmarrin/snowflake"
	"gorm.io/gorm"
)

// 雪花 ID 生成器（单节点；多实例部署应按机器分配 node id）。
var sfNode *snowflake.Node

func init() {
	n, err := snowflake.NewNode(1)
	if err != nil {
		panic(err)
	}
	sfNode = n
}

// NewID 生成字符串型雪花 ID（全库主键统一用它）。
func NewID() string { return sfNode.Generate().String() }

// BaseModel 是所有数据库映射结构体的基础字段：
// 字符串雪花主键 + 创建/更新时间 + GORM 软删除索引（deleted_at）。
// 约定：每个模型都嵌入它，不再各自声明 ID/CreatedAt/UpdatedAt。
type BaseModel struct {
	ID        string         `gorm:"primaryKey;size:24" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}

// BeforeCreate 为空 ID 的新记录分配雪花 ID（嵌入后各模型自动具备）。
func (b *BaseModel) BeforeCreate(*gorm.DB) error {
	if b.ID == "" {
		b.ID = NewID()
	}
	return nil
}
