package models

import (
	"encoding/json"

	"gorm.io/gorm"
)

// 系统设置
type SystemSetting struct {
	ID          uint   `gorm:"primaryKey"`
	ConfigName  string `gorm:"type:varchar(50)"`
	ConfigValue string `gorm:"type:text"`
}

func (m *SystemSetting) Get(configName string) (result string, err error) {
	var res SystemSetting
	if err := Db.Model(m).Select("ConfigValue").First(&res, "config_name=?", configName).Error; err != nil {
		return result, err
	}
	result = res.ConfigValue
	return result, nil
}

func (m *SystemSetting) GetValueByInterface(configName string, structValue interface{}) error {
	result, err := m.Get(configName)
	if err != nil {
		return err
	}
	err = json.Unmarshal([]byte(result), structValue)
	if err != nil {
		return err
	}
	return nil
}

// 暂时仅支持结构体和字符串
func (m *SystemSetting) Set(configName string, configValue interface{}) error {
	findRes := SystemSetting{}
	db := Db.Model(m).First(&findRes, "config_name=?", configName)
	if err := db.Error; err != nil && err != gorm.ErrRecordNotFound {
		return err
	}
	value := ""
	if s, ok := configValue.(string); !ok {
		if jsonStr, err := json.Marshal(configValue); err != nil {
			value = ""
		} else {
			value = string(jsonStr)
		}
	} else {
		value = s
	}

	if db.RowsAffected == 0 {
		// 添加
		if err := Db.Model(m).Create(&SystemSetting{ConfigName: configName, ConfigValue: value}).Error; err != nil {
			return err
		}

	} else {
		// 修改
		if err := Db.Model(m).Where("id=?", findRes.ID).Update("config_value", value).Error; err != nil {
			return err
		}
	}
	return nil
}