package utils

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type PageData[T any] struct {
	Current   int   `json:"current"`   // 当前页码
	Size      int   `json:"size"`      // 每页数量
	Total     int64 `json:"total"`     // 总数
	TotalPage int   `json:"totalPage"` // 总页数
	Records   T     `json:"records"`   // 返回数据
}

type ginResponse struct {
	c *gin.Context
}

func GinResponse(c *gin.Context) ginResponse {
	return ginResponse{c: c}
}

func (r ginResponse) OK() {
	r.c.JSON(http.StatusOK, gin.H{
		"code":    http.StatusOK,
		"message": "success",
	})
}

func (r ginResponse) Failed() {
	r.c.JSON(http.StatusBadRequest, gin.H{
		"code":    http.StatusBadRequest,
		"message": "bad request",
	})
}

func (r ginResponse) FailedWithErr(msg string, err error) {
	r.c.JSON(http.StatusBadRequest, gin.H{
		"code":    http.StatusBadRequest,
		"message": fmt.Errorf("%s: %s", msg, err.Error()).Error(),
	})
}

func (r ginResponse) FailedWithMsg(msg string) {
	r.c.JSON(http.StatusBadRequest, gin.H{
		"code":    http.StatusBadRequest,
		"message": msg,
	})
}

func (r ginResponse) AuthorizationFailed() {
	r.c.JSON(http.StatusUnauthorized, gin.H{
		"code":    http.StatusUnauthorized,
		"message": "请先登陆",
	})
}

func (r ginResponse) OKWithData(data any) {
	r.c.JSON(http.StatusOK, gin.H{
		"code":    http.StatusOK,
		"message": "success",
		"data":    data,
	})
}

func (r ginResponse) OkWithPage(data any, total int64, current, size int) {
	// 处理一下页码、页数量
	if current == -1 {
		current = 1
		size = int(total)
	}
	// 计算总页码
	totalPage := GenTotalPage(total, size)
	// 返回结果
	r.c.JSON(http.StatusOK, map[string]any{
		"code":    http.StatusOK,
		"data":    &PageData[any]{Current: current, Size: size, Total: total, TotalPage: totalPage, Records: data},
		"message": "success",
	})
}
