package models

import (
	"github.com/lifei6671/mindoc/conf"
	"github.com/astaxie/beego/orm"
	"strings"
)

type Label struct {
	LabelId int		`orm:"column(label_id);pk;auto;unique;" json:"label_id"`
	LabelName string	`orm:"column(label_name);size(50);unique" json:"label_name"`
	BookNumber int		`orm:"column(book_number)" json:"book_number"`
}

// TableName 获取对应数据库表名.
func (m *Label) TableName() string {
	return "label"
}
// TableEngine 获取数据使用的引擎.
func (m *Label) TableEngine() string {
	return "INNODB"
}

func (m *Label)TableNameWithPrefix() string {
	return conf.GetDatabasePrefix() +  m.TableName()
}

func NewLabel() *Label {
	return &Label{}
}

func (m *Label) FindFirst(field string, value interface{}) (*Label,error){
	o := orm.NewOrm()

	err := o.QueryTable(m.TableNameWithPrefix()).Filter(field, value).One(m)

	return m, err
}

//插入或更新标签.
func (m *Label) InsertOrUpdate(labelName string) error {
	o := orm.NewOrm()

	err := o.QueryTable(m.TableNameWithPrefix()).Filter("label_name",labelName).One(m)
	if err != nil && err != orm.ErrNoRows {
		return err
	}
	count,_ := o.QueryTable(NewBook().TableNameWithPrefix()).Filter("label__icontains",labelName).Count()
	m.BookNumber = int(count)
	m.LabelName = labelName

	if err == orm.ErrNoRows {
		err = nil
		m.LabelName = labelName
		_,err = o.Insert(m)
	}else{
		_,err = o.Update(m)
	}
	return err
}

//批量插入或更新标签.
func (m *Label) InsertOrUpdateMulti(labels string)  {
	if  labels != "" {
		labelArray := strings.Split(labels, ",")

		for _, label := range labelArray {
			if label != "" {
				NewLabel().InsertOrUpdate(label)
			}
		}
	}
}

//分页查找标签.
func (m *Label) FindToPager(pageIndex, pageSize int) (labels []*Label,totalCount int,err error) {
	o := orm.NewOrm()

	count,err := o.QueryTable(m.TableNameWithPrefix()).Count()

	if err != nil {
		return
	}
	totalCount = int(count)

	offset := (pageIndex - 1) * pageSize

	_,err = o.QueryTable(m.TableNameWithPrefix()).OrderBy("-book_number").Offset(offset).Limit(pageSize).All(&labels)

	return
}

