package dao

import (
	"enterprise/common/model"
	"github.com/smbrave/goutil"
	"gorm.io/gorm"
	"time"
)

type StaffTokenDao struct {
}

func NewStaffTokenDao() *StaffTokenDao {
	return &StaffTokenDao{}
}

func (d *StaffTokenDao) TableName() string {
	return "user_token"
}

func (d *StaffTokenDao) Create(o *model.StaffToken) (int64, error) {
	o.CreateTime = time.Now().Unix()
	res := GetDB().Table(d.TableName()).Create(o)
	return o.Id, res.Error
}

func (d *StaffTokenDao) Update(o *model.StaffToken, fields ...string) error {
	tx := GetDB().Table(d.TableName())
	tx.Where("id = ?", o.Id)
	if len(fields) == 0 {
		res := tx.Save(o)
		return res.Error
	}

	dat := goutil.ModelFieldValue(o, fields...)
	return tx.Updates(dat).Error
}

func (d *StaffTokenDao) Delete(id int64) error {
	res := GetDB().Table(d.TableName()).Delete(&model.StaffToken{}, id)
	return res.Error
}

func (d *StaffTokenDao) Get(id int64) (*model.StaffToken, error) {
	var u model.StaffToken
	tx := GetDB().Table(d.TableName())
	tx = tx.Where("id = ?", id)
	res := tx.First(&u)
	if res.Error == gorm.ErrRecordNotFound {
		return nil, nil
	}

	if res.Error != nil {
		return nil, res.Error
	}
	return &u, nil
}

func (d *StaffTokenDao) GetByToken(token string) (*model.StaffToken, error) {
	var o model.StaffToken
	tx := GetDB().Table(d.TableName())
	tx = tx.Where("token = ?", token)
	res := tx.First(&o)

	if res.Error == gorm.ErrRecordNotFound {
		return nil, nil
	}

	if res.Error != nil {
		return nil, res.Error
	}
	return &o, nil
}

func (d *StaffTokenDao) DeleteHistory(lastDay int) (int64, error) {
	tx := GetDB().Table(d.TableName())
	deleteTime := time.Now().AddDate(0, 0, 0-lastDay).Unix()
	tx.Where("expire_time <= ?", deleteTime)
	tx.Delete(&model.StaffToken{})
	return tx.RowsAffected, tx.Error
}