package app

import (
	"fmt"
	"net/http"

	"mini-chat/internal/code"
	"mini-chat/internal/pkg/core"
	"mini-chat/internal/pkg/timeutil"
	"mini-chat/internal/pkg/validation"

	"gorm.io/gorm"
)

type listRequest struct {
	AppID    string `form:"app_id"`    // 小程序ID
	AdminID  int32  `form:"admin_id"`  // 客服编号
	Name     string `form:"name"`      // 小程序名称
	Page     int    `form:"page"`      // 当前页码，默认为第一页
	PageSize int    `form:"page_size"` // 每页返回的数据量
}

type listData struct {
	ID          int32  `json:"id"`          // 小程序编号
	AppID       string `json:"app_id"`      // 小程序ID
	AppSecret   string `json:"app_secret"`  // 小程序密钥
	Name        string `json:"name"`        // 小程序名称
	Description string `json:"description"` // 小程序描述
	Avatar      string `json:"avatar"`      // 小程序头像
	TemplateID  string `json:"template_id"` // 模版ID
	CreatedAt   string `json:"created_at"`  // 创建时间
	UpdatedAt   string `json:"updated_at"`  // 更新时间
}

type listResponse struct {
	Page     int        `json:"page"`      // 当前页码
	PageSize int        `json:"page_size"` // 每页返回的数据量
	Total    int64      `json:"total"`     // 符合查询条件的总记录数
	List     []listData `json:"list"`
}

// PageList 小程序列表
// @Summary 小程序列表
// @Description 小程序列表
// @Tags 管理端.小程序
// @Accept json
// @Produce json
// @Param name query string false "小程序名称"
// @Param app_id query string false "小程序ID"
// @Param admin_id query int false "客服编号"
// @Param page query int true "当前页码" default(1)
// @Param page_size query int true "每页返回的数据量，最多 100 条" default(20)
// @Success 200 {object} listResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/apps [get]
// @Security LoginVerifyToken
func (h *handler) PageList() core.HandlerFunc {
	return func(ctx core.Context) {
		req := new(listRequest)
		res := new(listResponse)

		if err := ctx.ShouldBindForm(req); err != nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.ParamBindError,
				validation.Error(err)),
			)
			return
		}

		if req.Page == 0 {
			req.Page = 1
		}

		if req.PageSize == 0 {
			req.PageSize = 20
		}

		if req.PageSize > 100 {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.ListAppError,
				fmt.Sprintf("%s: 一次最多只能查询 100 条", code.Text(code.ListAppError)),
			))
			return
		}

		query := h.readDB.MiniProgram.WithContext(ctx.RequestContext())

		if ctx.SessionUserInfo().IsSuper != 1 {
			query = query.Where(h.readDB.MiniProgram.AdminID.Eq(ctx.SessionUserInfo().Id))
		} else {
			if req.AdminID != 0 {
				query = query.Where(h.readDB.MiniProgram.AdminID.Eq(req.AdminID))
			}
		}

		if req.AppID != "" {
			query = query.Where(h.readDB.MiniProgram.AppID.Eq(req.AppID))
		}

		if req.Name != "" {
			query = query.Where(h.readDB.MiniProgram.Name.Like(fmt.Sprintf("%%%s%%", req.Name)))
		}

		listQueryDB := query.Session(&gorm.Session{})
		countQueryDB := query.Session(&gorm.Session{})

		resultData, err := listQueryDB.
			Order(h.readDB.MiniProgram.ID.Desc()).
			Limit(req.PageSize).
			Offset((req.Page - 1) * req.PageSize).Find()
		if err != nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.ListAppError,
				fmt.Sprintf("%s：%s", code.Text(code.ListAppError), err.Error())),
			)
			return
		}

		count, err := countQueryDB.Count()
		if err != nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.ListAppError,
				fmt.Sprintf("%s：%s", code.Text(code.ListAppError), err.Error())),
			)
			return
		}

		res.Page = req.Page
		res.PageSize = req.PageSize
		res.Total = count
		res.List = make([]listData, len(resultData))

		for k, v := range resultData {
			res.List[k] = listData{
				ID:          v.ID,
				AppID:       v.AppID,
				AppSecret:   v.AppSecret,
				Name:        v.Name,
				Description: v.Description,
				Avatar:      v.Avatar,
				TemplateID:  v.TemplateID,
				CreatedAt:   timeutil.FriendlyTime(v.CreatedAt),
				UpdatedAt:   timeutil.FriendlyTime(v.UpdatedAt),
			}
		}

		ctx.Payload(res)
	}
}
