package hasaki_{{.app_name}}

import (
	"errors"
	"git.ouxuan.net/hasaki-service/hasaki-sdk/hsktime"
	"strconv"
	"xorm.io/xorm"
)

type Model struct {
	Id        int           `json:"id" xorm:"not null pk autoincr INT(11)"`
	CreatedAt hsktime.Time  `json:"created_at" xorm:"created comment('创建时间')"`
	UpdatedAt hsktime.Time  `json:"updated_at" xorm:"updated comment('更新时间')"`
	DeletedAt hsktime.Time  `json:"-" xorm:"deleted comment('是否删除') TIMESTAMP INDEX"`
	session   *xorm.Session `xorm:"-"`
	instance  interface{}   `xorm:"-"`
}

func (m *Model) checkInstance() error {
	if m.instance == nil {
		return errors.New("instance 未实例化")
	}
	return nil
}

func (m *Model) SetInstance(instance interface{}) {
	m.instance = instance
}

// 增删改查
func (m *Model) Save(cols ...string) (int64, error) {
	err := m.checkInstance()
	if err != nil {
		return 0, err
	}
	if m.Id > 0 {
		if len(cols) > 0 {
			return m.session.Cols(cols...).Update(m.instance)
		} else {
			return m.session.AllCols().Update(m.session)
		}
	} else {
		return m.session.InsertOne(m.instance)
	}
}

func (m *Model) Del() (int64, error) {
	err := m.checkInstance()
	if err != nil {
		return 0, err
	}
	return m.session.ID(m.Id).Delete(m.instance)
}

func (m *Model) Get() (bool, error) {
	err := m.checkInstance()
	if err != nil {
		return false, err
	}
	return m.session.Unscoped().Get(m.instance)
}

//分页  cond["page"] 第几页 cond["page_size"] 多少条
func Page(cond map[string]string, s *xorm.Session) *xorm.Session {
	if cond["page_size"] != "" {
		size, _ := strconv.Atoi(cond["page_size"])
		page, _ := strconv.Atoi(cond["page"])
		if page <= 0 {
			page = 0
		} else {
			page = page - 1
		}
		s = s.Limit(size, page*size)
	}
	return s
}

func Like(col, key string, s *xorm.Session) *xorm.Session {
	if key != "" {
		s = s.Where(col+" like ?", "%"+key+"%")
	}
	return s
}


func JsonContains(col, key string, s *xorm.Session) *xorm.Session {
	if key != "" {
		s = s.Where(`JSON_CONTAINS(` + col + `, '` + key + `', '$')`)
	}
	return s
}