// ============================================================================
// This is auto-generated by gf cli tool only once. Fill this file as you wish.
// ============================================================================

package plug_linktype

import (
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/frame/g"
)

// AddReq 用于获取添加栏目的请求参数
type AddReq struct {
	LinktypeName  string `p:"linkTypeName" v:"required#栏目名称不能为空"`  // 栏目名称
	LinktypeOrder int    `p:"linkTypeOrder" v:"required#栏目排序不能为空"` // 栏目排序
}

// EditReq 用于存储修改栏目的请求参数
type EditReq struct {
	LinktypeId int64 `p:"linkTypeID" v:"required|min:1#主键ID不能为空|主键ID值错误"`
	AddReq
}

// SelectPageReq 用于存储分页查询栏目的请求参数
type SelectPageReq struct {
	LinktypeName string `p:"linkTypeName"` // 栏目名称,用于根据栏目名来模糊查询
	PageNo       int64  `p:"pageNum"`      // 当前页
	PageSize     int64  `p:"pageSize"`     // 每页显示记录数
}

// GetLinkTypeByID 根据ID查询栏目记录
func GetLinkTypeByID(id int64) (*Entity, error) {
	entity, err := Model.FindOne(id)
	if err != nil {
		g.Log().Error(err)
		return nil, gerror.New("根据ID查询栏目记录出错")
	}
	if entity == nil {
		return nil, gerror.New("根据ID未能查询到栏目记录")
	}
	return entity, nil
}

// CheakLinkTypeNameUnique 用于检测栏目名称唯一性
func CheakLinkTypeNameUnique(linkTypeName string, linkTypeID int64) error {
	var (
		entity *Entity // 用于存储查询出的记录
		err    error
	)
	// 此函数用于增加栏目时没有ID传入
	if linkTypeID == 0 {
		entity, err = Model.FindOne(Columns.LinktypeName, linkTypeName)
	} else {
		// 用于修改时有ID传入
		entity, err = Model.Where(Columns.LinktypeName, linkTypeName).And(Columns.LinktypeId+"!=?", linkTypeID).FindOne()
	}
	if err != nil {
		g.Log().Error(err)
		return gerror.New("校验栏目名称唯一性出错")
	}
	if entity != nil {
		return gerror.New("栏目名称已存在")
	}
	return nil
}

// AddSave 用于添加栏目
func AddSave(req *AddReq) error {
	// 定义一个实体用于接收req中的信息并将信息添加到数据库
	var entity Entity
	entity.LinktypeName = req.LinktypeName
	entity.LinktypeOrder = uint(req.LinktypeOrder)
	// 调用实体中的Insert方法将信息添加到数据库中
	_, err := entity.Insert()
	if err != nil {
		// 错误放入错误日志
		g.Log().Error(err)
		// New创建并返回从给定文本格式化的错误
		return gerror.New("信息插入数据库失败")
	}
	return nil
}

// DeleteLinkTypeByID 根据ID批量删除栏目
func DeleteLinkTypeByID(id []int) error {
	_, err := Model.Where("linktype_id in(?)", id).Delete()
	if err != nil {
		g.Log().Error(err)
		return gerror.New("批量删除栏目出错")
	}
	return nil
}

// EditSave 修改
func EditSave(req *EditReq) error {
	// 先根据ID来查询要修改的广告位记录
	entity, err := GetLinkTypeByID(req.LinktypeId)
	if err != nil {
		return err
	}
	// 修改实体
	entity.LinktypeName = req.LinktypeName
	entity.LinktypeOrder = uint(req.LinktypeOrder)
	_, err = Model.Save(entity)
	if err != nil {
		g.Log().Error(err)
		return gerror.New("修改栏目失败")
	}
	return nil
}

// 分页查询,返回值total总记录数,page当前页
func SelectListByPage(req *SelectPageReq) (total int, page int64, list []*Entity, err error) {
	model := Model
	if req != nil {
		if req.LinktypeName != "" {
			model = model.Where("linktype_name like ?", "%"+req.LinktypeName+"%")
		}
	}
	// 查询栏目总记录数(总行数)
	total, err = model.Count()
	if err != nil {
		g.Log().Error(err)
		err = gerror.New("获取总记录数失败")
		return 0, 0, nil, err
	}
	if req.PageNo == 0 {
		req.PageNo = 1
	}
	page = req.PageNo
	if req.PageSize == 0 {
		req.PageSize = 10
	}
	// 分页排序查询
	list, err = model.Page(int(page), int(req.PageSize)).Order("linktype_order asc,linktype_id asc").All()
	if err != nil {
		g.Log().Error(err)
		err = gerror.New("分页查询栏目失败")
		return 0, 0, nil, err
	}
	return total, page, list, nil
}
