package v1

import (
	"github.com/druidcaesa/gotool"
	"strconv"
	"strings"
	"time"
	"ulink-admin/frame"
	"ulink-admin/modules/doc/models/model"
	"ulink-admin/modules/doc/models/req"
	"ulink-admin/modules/doc/service"
	"ulink-admin/pkg/excels"
	"ulink-admin/pkg/file"
	"ulink-admin/pkg/page"
	"ulink-admin/pkg/resp"
)

type DocArticleApi struct {
	docArticleService service.DocArticleService
}

// List 查询文章分页数据
// @Summary 分页查询文章数据接口
// @Description 分页查询文章数据接口
// @Tags 文章相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param object query req.DocArticleQuery false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=page.Page{list=model.DocArticle},msg=string} "分页获取文章列表,返回包括列表,总数,页码,每页数量"
// @Router /docarticle/list [get]
func (a DocArticleApi) List(c *frame.Context) {
	query := req.DocArticleQuery{}
	if c.Bind(&query) != nil {
		resp.ParamError(c)
		return
	}
	list, i := a.docArticleService.FindList(query)
	resp.OK(c, page.Page{
		List:  list,
		Total: i,
		Size:  query.PageSize,
	})
}

// List 查询文章所有数据
// @Summary 查询全部数据文章数据接口
// @Description 查询全部数据文章数据接口
// @Tags 文章相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=model.DocArticle,msg=string} "分页获取文章列表,返回包括列表,总数,页码,每页数量"
// @Router /docarticle/listAll [get]
func (a DocArticleApi) ListAll(c *frame.Context) {
	list := a.docArticleService.FindAll()
	resp.OK(c, list)
}

// Get 根据文章Id获取详细信息
// @Summary 文章详情查询接口
// @Description 文章详情查询接口
// @Tags 文章相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param id path   int true "id" id
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=model.DocArticle,msg=string} "返回文章详情查询"
// @Router /docarticle [get]
func (a DocArticleApi) Get(c *frame.Context) {
	param := c.Param("id")
	id, _ := strconv.ParseInt(param, 10, 64)
	resp.OK(c, a.docArticleService.GetDocArticleById(id))
}

// Add 新增文章
// @Summary 新增文章接口
// @Description 新增文章接口
// @Tags 文章相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param  data body model.DocArticle true "文章实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /docarticle/add [post]
func (a DocArticleApi) Add(c *frame.Context) {
	docArticle := model.DocArticle{}
	if err := c.Bind(&docArticle); err != nil {
		resp.ParamError(c, map[string]string{"error": err.Error()})
		return
	}
	docArticle.CreateBy = admin.GetUserInfo(c).UserName
	docArticle.CreateTime = time.Now()
	docArticle.UpdateBy = admin.GetUserInfo(c).UserName
	docArticle.UpdateTime = time.Now()
	if a.docArticleService.Insert(&docArticle) {
		resp.OK(c)
	} else {
		resp.Error(c)
	}
}

// Edit 修改文章数据接口
// @Summary 修改文章接口
// @Description 新增文章接口
// @Tags 文章相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param  data body model.DocArticle true "文章实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /docarticle/edit [put]
func (a DocArticleApi) Edit(c *frame.Context) {
	docArticle := model.DocArticle{}
	if c.Bind(&docArticle) != nil {
		resp.ParamError(c)
		return
	}
	docArticle.UpdateBy = admin.GetUserInfo(c).UserName
	docArticle.UpdateTime = time.Now()
	if a.docArticleService.Update(&docArticle) {
		resp.OK(c)
	} else {
		resp.Error(c)
	}
}

// Delete 删除文章数据
// @Summary 删除文章接口
// @Description 删除文章接口
// @Tags 文章相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param id path   int true "id" id
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /docarticle [delete]
func (a DocArticleApi) Delete(c *frame.Context) {
	//获取docArticleId
	param := c.Param("id")
	list := make([]int64, 0)
	if gotool.StrUtils.HasNotEmpty(param) {
		strs := strings.Split(param, ",")
		for _, str := range strs {
			id, _ := strconv.ParseInt(str, 10, 64)
			list = append(list, id)
		}
	}
	//判断是否可以删除
	if a.docArticleService.Delete(list) {
		resp.OK(c)
	} else {
		resp.Error(c)
	}
}

// Export 导出excel
func (a DocArticleApi) Export(c *frame.Context) {
	query := req.DocArticleQuery{}
	if c.Bind(&query) != nil {
		resp.ParamError(c)
		return
	}
	list, _ := a.docArticleService.FindList(query)
	excelList := make([]interface{}, 0)
	for _, docArticle := range *list {
		excelList = append(excelList, docArticle)
	}
	_, files := excels.ExportExcel(excelList, "文章数据表")
	file.DownloadExcel(c, files)
}