package dao

import (
	"github.com/druidcaesa/gotool"
	"reflect"
	"strings"
	"ulink-admin/modules/doc/models/model"
	"ulink-admin/modules/doc/models/req"
	"ulink-admin/pkg/base"
	"ulink-admin/pkg/page"
	"ulink-admin/utils"
	"xorm.io/xorm"
)

type DocArticleDao struct {
}

func (d DocArticleDao) selectSql(session *xorm.Session) *xorm.Session {
	return session.Table([]string{"doc_article", "o"})
}

// SelectAll 查询所有文章数据,数据库操作
func (d DocArticleDao) SelectAll() []*model.DocArticle {
	session := base.SqlDB.NewSession()
	docArticle := make([]*model.DocArticle, 0)
	err := session.Find(&docArticle)
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
		return nil
	}
	return docArticle
}

// Find 查询文章分页数据
func (d DocArticleDao) Find(query req.DocArticleQuery) (*[]model.DocArticle, int64) {
	docArticle := make([]model.DocArticle, 0)
	session := base.SqlDB.NewSession().Table(model.DocArticle{}.TableName())

	if query.Id > 0 {
		session.And("id = ?", query.Id)
	}
	if !gotool.StrUtils.HasEmpty(query.Label) {
		session.And("label = ?", query.Label)
	}
	if query.CatId > 0 {
		session.And("cat_id = ?", query.CatId)
	}
	if !gotool.StrUtils.HasEmpty(query.Profile) {
		session.And("profile = ?", query.Profile)
	}
	if !gotool.StrUtils.HasEmpty(query.Url) {
		session.And("url = ?", query.Url)
	}
	if query.IsTop > 0 {
		session.And("is_top = ?", query.IsTop)
	}
	if query.IsHot > 0 {
		session.And("is_hot = ?", query.IsHot)
	}
	if !gotool.StrUtils.HasEmpty(query.Content) {
		session.And("content = ?", query.Content)
	}
	if query.Sort > 0 {
		session.And("sort = ?", query.Sort)
	}
	if !gotool.StrUtils.HasEmpty(query.CreateBy) {
		session.And("create_by = ?", query.CreateBy)
	}
	if !gotool.StrUtils.HasEmpty(query.UpdateBy) {
		session.And("update_by = ?", query.UpdateBy)
	}
	if !gotool.StrUtils.HasEmpty(query.BeginTime) {
		session.And("date_format(u.create_time,'%y%m%d') >= date_format(?,'%y%m%d')", query.BeginTime)
	}
	if !gotool.StrUtils.HasEmpty(query.EndTime) {
		session.And("date_format(u.create_time,'%y%m%d') <= date_format(?,'%y%m%d')", query.EndTime)
	}
	total, err := session.Limit(query.PageSize, page.StartSize(query.PageNum, query.PageSize)).FindAndCount(&docArticle)
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
		return nil, 0
	}
	return &docArticle, total
}

// Insert 添加文章数据
func (d DocArticleDao) Insert(docArticle *model.DocArticle) int64 {
	session := base.SqlDB.NewSession()
	session.Begin()
	insert, err := session.Insert(docArticle)
	if err != nil {
		session.Rollback()
		gotool.Logs.ErrorLog().Println(err)
		return 0
	}
	session.Commit()
	return insert
}

// GetDocArticleById 根据id查询文章数据
func (d DocArticleDao) GetDocArticleById(docArticle model.DocArticle) *model.DocArticle {
	_, err := base.SqlDB.NewSession().Where("id= ?", docArticle.Id).Get(&docArticle)
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
		return nil
	}
	return &docArticle
}

// Delete 批量删除文章
func (d DocArticleDao) Delete(docArticle []int64) int64 {
	session := base.SqlDB.NewSession()
	session.Begin()
	i, err := session.In("id", docArticle).Delete(&model.DocArticle{})
	if err != nil {
		session.Rollback()
		gotool.Logs.ErrorLog().Println(err)
		return 0
	}
	session.Commit()
	return i
}

// Update 修改文章数据
func (d DocArticleDao) Update(docArticle *model.DocArticle) bool {
	session := base.SqlDB.NewSession()
	session.Begin()
	_, err := session.Where("id= ?", docArticle.Id).Update(docArticle)
	if err != nil {
		session.Rollback()
		gotool.Logs.ErrorLog().Println(err)
		return false
	}
	session.Commit()
	return true
}

// CheckUnique 唯一性检查
func (d DocArticleDao) CheckUnique(docArticle model.DocArticle, condition []string) int64 {
	session := base.SqlDB.Table(docArticle.TableName())
	if docArticle.Id > 0 {
		session.And("id != ?", docArticle.Id)
	}

	for _, item := range condition {
		fieldValue := reflect.ValueOf(docArticle).FieldByName(utils.Ucfirst(item))
		if strings.Contains(fieldValue.Type().String(), "int") {
			session.And(utils.Camel2Case(item)+" = ?", fieldValue.Int())
		} else if strings.Contains(fieldValue.Type().String(), "string") {
			session.And(utils.Camel2Case(item)+" = ?", fieldValue.String())
		} else {
			session.And(utils.Camel2Case(item)+" = ?", fieldValue.String())
		}
	}
	count, err := session.Count()
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
	}
	return count
}

func (d DocArticleDao) FindCountByCatId(id int64) int64 {
	session := base.SqlDB.Table(model.DocArticle{}.TableName())
	session.And("cat_id = ?", id)
	count, err := session.Count()
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
	}
	return count
}