package controller

import (
	"fmt"
	"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 pic model.Pic
	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
	}
	fmt.Println(goodsJson)
	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)
	err = pic.Save(id, goodsJson.Pic)
	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
	var pic model.Pic
	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)
	pic.Id = uint(id)
	err = goods.Delete()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	err = pic.Delete()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	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
	var pic model.Pic
	err := c.ShouldBindJSON(&goods)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	err = goods.Revise()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	pic.Id = goods.Id
	err = pic.Delete()
	err = pic.Save(pic.Id, goods.Pic)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	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)
	}()
	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
	var pic model.Pic
	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()
	pics, err := pic.GetGoodsPic(uint(id))
	goods.Pic = pics
	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)
}

// GetGoodsList
// @Tags 商品模块
// @Summary 批量获取商品信息
// @Produce application/json
// @Param id body []string true "商品id列表"
// @Success 200 {object} response.Response
// @Router /goods/list [post]
func GetGoodsList(c *gin.Context) {
	var g model.GoodsSurface
	jsonData := struct {
		Id []uint `json:"id"`
	}{}
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	goodsInfo, err := g.GetGoodsList(jsonData.Id)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	response.Success(c.Writer, "success", gin.H{"goods": goodsInfo})
}