//
// Copyright (C) 2024 veypi <i@veypi.com>
// 2025-03-04 16:08:06
// Distributed under terms of the MIT license.
//

package settings

import (
	"github.com/veypi/vbase/cfg"
	"github.com/veypi/vbase/models"
	"github.com/veypi/vigo"
	"gorm.io/gorm"
)

// UpdateItem 更新项
type UpdateItem struct {
	Key   string `json:"key" src:"json" desc:"设置键"`
	Value string `json:"value" src:"json" desc:"设置值"`
}

// UpdateRequest 更新请求
type UpdateRequest struct {
	Settings []UpdateItem `json:"settings" src:"json" desc:"设置列表"`
}

// UpdateResponse 更新响应
type UpdateResponse struct {
	Updated int `json:"updated"`
}

// update 批量更新设置（仅管理员可用）
func update(x *vigo.X, req *UpdateRequest) (*UpdateResponse, error) {
	// 获取当前用户ID
	userID := ""
	if u := x.Get("user_id"); u != nil {
		userID = u.(string)
	}

	// 使用事务确保批量更新的原子性
	db := cfg.DB()
	updated := 0

	err := db.Transaction(func(tx *gorm.DB) error {
		for _, item := range req.Settings {
			var s models.Setting
			if err := tx.Where("`key` = ?", item.Key).First(&s).Error; err != nil {
				return err
			}
			s.Value = item.Value
			s.UpdatedBy = userID
			if err := tx.Save(&s).Error; err != nil {
				return err
			}
			updated++
		}
		return nil
	})

	if err != nil {
		return nil, vigo.ErrInternalServer.WithError(err)
	}

	return &UpdateResponse{
		Updated: updated,
	}, nil
}
