package order

import (
	"crypto/rand"
	"errors"
	"strconv"

	"gorm.io/gorm"
	"hfb_sys/backend/internal/auditlog"
	"hfb_sys/backend/internal/timeutil"
)

func firstNonEmpty(values ...string) string {
	for _, value := range values {
		if value != "" {
			return value
		}
	}
	return ""
}

func newOrderNo() (string, error) {
	// 生成格式：RO + YYYYMMDDHHMMSS + 3位随机数
	// 例如：RO20260603123456789
	now := timeutil.ShanghaiNow()

	// 时间部分：年月日时分秒 (14位)
	timeStr := now.Format("20060102150405")

	// 随机部分：3位数字 (000-999)
	buf := make([]byte, 2)
	if _, err := rand.Read(buf); err != nil {
		return "", err
	}
	// 将2字节转为0-999的数字
	randomNum := (int(buf[0])<<8 | int(buf[1])) % 1000

	return "RO" + timeStr + strconv.Itoa(1000 + randomNum)[1:], nil
}

func appendAuditLog(tx *gorm.DB, actorID uint64, action string, bizType string, bizID uint64, meta AuditMeta, detail map[string]any) error {
	return auditlog.Append(tx, auditlog.Entry{
		ActorType: "admin",
		ActorID:   actorID,
		Action:    action,
		BizType:   bizType,
		BizID:     &bizID,
		Meta:      meta,
		Detail:    detail,
	})
}

func IsNotFound(err error) bool {
	return errors.Is(err, gorm.ErrRecordNotFound)
}
