package controller

import (
	"github.com/gin-gonic/gin"
	"strconv"
	"time"
	"trading-go/model"
	"trading-go/response"
	"trading-go/util"
)

//// GetAllGoods
//// @Tags 商品模块
//// @Summary 获取所有商品
//// @Produce application/json
//// @Success 200 {object} response.Response
//// @Router /goods [get]
//func GetAllGoods(c *gin.Context) {
//	var goods []model.GoodsSurface
//	goods = append(goods, model.GoodsSurface{})
//	goods = append(goods, model.GoodsSurface{})
//	response.Success(c.Writer, "success", goods)
//}

// CreatGoods
// @Tags 商品模块
// @Summary 创建商品
// @Accept application/json
// @Produce application/json
// @Param json body model.GoodsJson true "商品信息"
// @Success 200 {object} response.Response
// @Router /goods/create [post]
func CreatGoods(c *gin.Context) {
	var goodsJson model.GoodsJson
	var category model.CategoryOfGoods
	err := c.ShouldBindJSON(&goodsJson)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	goods := goodsJson.Change()
	id, err := goods.Create()
	go util.NewItem(id, uint(time.Now().Unix()), goodsJson.Title, goodsJson.Desc)
	go util.NewIndex(id, goodsJson.Desc+goodsJson.Title)
	err = category.Save(id, goodsJson.Categories)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	response.Success(c.Writer, "success", nil)
}

// DGoods
// @Tags 商品模块
// @Summary 删除商品
// @Produce application/json
// @Param id path int64 true "商品id"
// @Success 200 {object} response.Response
// @Router /goods/delete/{id} [delete]
func DGoods(c *gin.Context) {
	var goods model.Goods
	ids := c.Param("id")
	id, err := strconv.Atoi(ids)

	go util.DelItem(uint(id))

	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	goods.Id = uint(id)
	err = goods.Delete()
	go util.DelIndex(goods.Id)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	response.Success(c.Writer, "success", nil)
}

// GetGoodsPage
// @Tags 商品模块
// @Summary 获取所有商品
// @Produce application/json
// @Param page path int true "页数"
// @Param pageSize path int true "一页的大小"
// @Success 200 {object} response.Response
// @Router /goods/{page}/{pageSize} [get]
func GetGoodsPage(c *gin.Context) {
	var goods model.GoodsSurface
	p := c.Param("page")
	pS := c.Param("pageSize")
	page, err := strconv.Atoi(p)
	pageSize, err := strconv.Atoi(pS)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	rsp, err := goods.GetPaged(page, pageSize)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	cnt, err := goods.GetCnt()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	if cnt > page*pageSize {
		rsp.HNext = true
	}
	response.Success(c.Writer, "success", rsp)
}

// GetRecommend
// @Tags 商品模块
// @Summary 分页获取推荐商品
// @Produce application/json
// @Param id query int64 true "用户id"
// @Param size query int true "推荐的数目"
// @Success 200 {object} response.Response
// @Router /goods/recommend [get]
func GetRecommend(c *gin.Context) {
	var goods model.GoodsSurface
	ids := c.Param("id")
	s := c.Query("size")
	id, err := strconv.Atoi(ids)
	size, err := strconv.Atoi(s)
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	data, err := goods.GetRecommend(uint(id), size)
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	//rsp.Data = goods
	response.Success(c.Writer, "success", data)
}

// ReviseGoods
// @Tags 商品模块
// @Summary  修改商品信息
// @Produce application/json
// @Param json body model.Goods true "商品信息"
// @Success 200 {object} response.Response
// @Router /goods/revise [post]
func ReviseGoods(c *gin.Context) {
	var goods model.Goods
	err := c.ShouldBindJSON(&goods)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	err = goods.Revise()
	go func() {
		util.DelIndex(goods.Id)
		util.NewIndex(goods.Id, goods.Desc+goods.Title)
	}()
	go func() {
		util.DelItem(goods.Id)
		util.NewItem(goods.Id, uint(time.Now().Unix()), goods.Title, goods.Desc)
	}()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	response.Success(c.Writer, "success", nil)
}

// GetGoodDetail
// @Tags 商品模块
// @Summary  获取商品详细信息
// @Produce application/json
// @Param id path int64 true "商品id"
// @Param uid query int64 true "访问的用户id"
// @Param date query int64 true "访问时间的时间戳"
// @Success 200 {object} response.Response
// @Router /goods/detail/{id} [get]
func GetGoodDetail(c *gin.Context) {
	var goods model.Goods
	ids := c.Param("id")
	uids := c.Query("uid")
	ts := c.Query("date")
	id, err := strconv.Atoi(ids)
	uid, err := strconv.Atoi(uids)
	date, err := strconv.Atoi(ts)
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	goods.Id = uint(id)
	err = goods.GetDetail()
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	go util.Recommend(uint(uid), uint(id), uint(date))
	response.Success(c.Writer, "success", goods)
}

// GetUserGoods
// @Tags 商品模块
// @Summary  获取某个用户的所有商品
// @Produce application/json
// @Param id path int64 true "用户id"
// @Success 200 {object} response.Response
// @Router /goods/user/{id} [get]
func GetUserGoods(c *gin.Context) {
	var goods model.Goods
	ids := c.Param("id")
	id, err := strconv.Atoi(ids)
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	goods.OwnerId = uint(id)
	data, err := goods.GetUserGoods()
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	response.Success(c.Writer, "success", data)
}

// SearchGoods
// @Tags 商品模块
// @Summary  搜索商品并分页显示
// @Produce application/json
// @Param page path int true "页数"
// @Param pageSize path int true "一页的大小"
// @Param keyword query string true "搜素关键词"
// @Success 200 {object} response.Response
// @Router /goods/search/{page}/{pageSize} [get]
func SearchGoods(c *gin.Context) {
	var good model.GoodsSurface
	p := c.Param("page")
	pS := c.Param("pageSize")
	key := c.Query("keyword")
	page, err := strconv.Atoi(p)
	pageSize, err := strconv.Atoi(pS)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	rsp, err := good.SearchPaged(key, page, pageSize)
	if err != nil {
		response.Fail(c.Writer, err.Error(), 400)
		return
	}
	response.Success(c.Writer, "success", rsp)
}

// GetGoodsCategory
// @Tags 商品模块
// @Summary  按分类查找商品并分页显示
// @Produce application/json
// @Param page path int true "页数"
// @Param pageSize path int true "一页的大小"
// @Param category query uint true "商品分类id"
// @Success 200 {object} response.Response
// @Router /goods/category/{page}/{pageSize} [get]
func GetGoodsCategory(c *gin.Context) {
	var goods model.GoodsSurface
	p := c.Param("page")
	pS := c.Param("pageSize")
	ca := c.Query("category")
	category, err := strconv.Atoi(ca)
	page, err := strconv.Atoi(p)
	pageSize, err := strconv.Atoi(pS)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	rsp, err := goods.GetCategoryPaged(page, pageSize, uint(category))
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	cnt, err := goods.GetCategoryCnt(uint(category))
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	if cnt > page*pageSize {
		rsp.HNext = true
	}
	response.Success(c.Writer, "success", rsp)
}