package models

import (
	"github.com/jinzhu/gorm"
	"time"
)

var RecordNotFound = gorm.ErrRecordNotFound

type BaseModel struct {
	CreatedAt time.Time  `json:"createdAt"` // 创建时间
	UpdatedAt time.Time  `json:"updatedAt"` // 更新时间
	DeletedAt *time.Time `json:"deletedAt"` // 删除时间
}

type Model struct {
	ID        uint32     `json:"id" gorm:"primary_key;AUTO_INCREMENT"` // 数据库记录编号
	CreatedAt time.Time  `json:"createdAt"`                            // 创建时间
	UpdatedAt time.Time  `json:"updatedAt"`                            // 更新时间
	DeletedAt *time.Time `json:"-" sql:"index"`                        // 删除时间
}

type Unix struct {
	ID          uint32    `gorm:"primary_key"`
	Created     time.Time `gorm:"-"` // 忽略储存在数据库
	CreatedUnix int64
	Updated     time.Time `gorm:"-"` // 忽略储存在数据库
	UpdatedUnix int64
}

// 查询前把时间格式化
func (m *Unix) AfterFind() (err error) {
	m.Created = time.Unix(m.CreatedUnix, 0).Local()
	m.Updated = time.Unix(m.UpdatedUnix, 0).Local()
	return
}

// 更新前对时间戳创建
func (m *Unix) BeforeCreate() (err error) {
	m.UpdatedUnix = time.Now().Local().Unix()
	m.CreatedUnix = time.Now().Local().Unix()
	return
}

// 更新前对时间戳更改
func (m *Unix) BeforeUpdate(scope *gorm.Scope) (err error) {
	return scope.SetColumn("UpdatedUnix", time.Now().Local().Unix())
}

type Unix64 struct {
	ID          uint64    `gorm:"primary_key"`
	Created     time.Time `gorm:"-"` // 忽略储存在数据库
	CreatedUnix int64
	Updated     time.Time `gorm:"-"` // 忽略储存在数据库
	UpdatedUnix int64
}

// 查询前把时间格式化
func (m *Unix64) AfterFind() (err error) {
	m.Created = time.Unix(m.CreatedUnix, 0).Local()
	m.Updated = time.Unix(m.UpdatedUnix, 0).Local()
	return
}

// 更新前对时间戳创建
func (m *Unix64) BeforeCreate() {
	m.UpdatedUnix = time.Now().Local().Unix()
	m.CreatedUnix = time.Now().Local().Unix()
}

// 更新前对时间戳更改
func (m *Unix64) BeforeUpdate(scope *gorm.Scope) (err error) {
	return scope.SetColumn("UpdatedUnix", time.Now().Local().Unix())
}

type Deleted struct {
	Unix64
	DeletedUnix int64 `sql:"index"`
}

// 删除回调
func (d *Deleted) BeforeCreate() {
	d.Unix64.BeforeCreate()
	d.DeletedUnix = -1
}

// 执行删除操作
func (d *Deleted) BeforeDelete(scope *gorm.Scope) (err error) {
	return scope.SetColumn("DeletedUnix", time.Now().Local().Unix())
}
