package model

import (
	"fmt"
	"sparrow/pkg/models"

	"github.com/jinzhu/gorm"
)

// SceneHis model
type SceneHis struct {
	db *gorm.DB
}

// Init init SceneHis
func (a *SceneHis) Init(db *gorm.DB) *SceneHis {
	a.db = db
	return a
}

// Query 分页查询场景执行历史
// sceneId: 按场景ID筛选
func (a *SceneHis) Query(pi, ps int, sceneId string) (datas []models.SceneHis, total int, err error) {
	tx := a.db.Where("1=1")
	if sceneId != "" {
		tx = tx.Where("scene_id = ?", sceneId)
	}
	tx = tx.Order("id desc")
	err = tx.Limit(ps).Offset((pi - 1) * ps).Find(&datas).Error
	err = tx.Model(&models.SceneHis{}).Count(&total).Error
	return
}

// GetBySceneId 根据场景ID获取历史记录列表
func (a *SceneHis) GetBySceneId(sceneId string) (datas []models.SceneHis, err error) {
	err = a.db.Where("scene_id = ?", sceneId).Order("id desc").Find(&datas).Error
	return
}

// Get 获取单条数据内容
func (a *SceneHis) Get(recordId string) (data models.SceneHis, err error) {
	cache := getCache()
	key := fmt.Sprintf("SceneHisId:%s", recordId)
	if v, ok := cache.Get(key); ok {
		_d := v.(*models.SceneHis)
		data = *_d
	} else {
		err = a.db.Where("record_id = ?", recordId).First(&data).Error
		if err == nil {
			cache.Set(key, &data)
		}
	}
	return
}

// Create 创建场景执行历史记录
func (a *SceneHis) Create(sceneHis *models.SceneHis) error {
	return a.db.Save(sceneHis).Error
}

// Delete delete
func (a *SceneHis) Delete(sceneHis *models.SceneHis) error {
	cache := getCache()
	key := fmt.Sprintf("SceneHis:%d", sceneHis.ID)
	if _, ok := cache.Get(key); ok {
		cache.Delete(key)
	}
	return a.db.Delete(sceneHis).Error
}

// Update update
func (a *SceneHis) Update(sceneHis *models.SceneHis) (data models.SceneHis, err error) {
	cache := getCache()
	key := fmt.Sprintf("SceneHis:%d", sceneHis.ID)
	if _, ok := cache.Get(key); ok {
		cache.Delete(key)
	}
	err = a.db.Model(&data).Update(sceneHis).Error
	return
}
