package bottype

import (
	"github.com/gofiber/fiber/v2"
	"matrix-middle-service/pkg/database"
	"matrix-middle-service/pkg/database/model"
	response "matrix-middle-service/pkg/resp"
	"matrix-middle-service/pkg/resp/errorx"
	"matrix-middle-service/pkg/utils/sonyflake"
	"matrix-middle-service/pkg/utils/validator"
)

func SetupBotType(r fiber.Router) {
	api := r.Group("/type")
	getBotTypeList(api)
	addBotType(api)
	DeleteBotTypeById(api)
}

// GetBotTypeList
// @Summary      获取 bot 类型列表
// @Description  获取 bot 类型列表
// @Tags         BotType
// @Accept       json
// @Produce      json
// @Success      200  {object}  response.Response{data=[]model.BotType}
// @Failure	     default {object}  errorx.CodeErrorResponse
// @Router       /bot/type/list [get]
func getBotTypeList(api fiber.Router) {
	api.Get("/list", func(ctx *fiber.Ctx) error {
		return database.Exec(func(db database.DataBase) error {
			list, err := db.GetAllBotTypes()
			if err = errorx.ParseError(err); err != nil {
				return ctx.JSON(err)
			}
			return ctx.JSON(response.NewResponse(list))
		})
	})
}

type AddBotTypeDto struct {
	// 名称
	Name string `json:"name" validate:"required"`
	// 是否启用
	Active bool `json:"active" validate:"required"`
}

// AddBotType
// @Summary      添加 bot 类型
// @Description  添加 bot 类型
// @Tags         BotType
// @Accept       json
// @Produce      json
// @Param		vo body AddBotTypeDto true "bot 类型"
// @Success      200  {object}  response.Response{data=bool}
// @Failure	     default {object}  errorx.CodeErrorResponse
// @Router       /bot/type/add [post]
func addBotType(api fiber.Router) {
	api.Post("/add", func(ctx *fiber.Ctx) error {
		dto := &AddBotTypeDto{}
		err := ctx.BodyParser(dto)
		if err = errorx.ParseError(err); err != nil {
			return ctx.JSON(err)
		}
		err = validator.ValidateStruct(dto)
		if err = errorx.ParseError(err); err != nil {
			return ctx.JSON(err)
		}

		return database.Exec(func(db database.DataBase) error {
			bt := &model.BotType{
				Id:     sonyflake.NextStrId(),
				Name:   dto.Name,
				Active: dto.Active,
			}

			err = db.AddBotType(bt)
			if err = errorx.ParseError(err); err != nil {
				return ctx.JSON(err)
			}
			return ctx.JSON(response.NewResponse(true))
		})
	})
}

// DeleteBotTypeById
// @Summary      删除 bot 类型
// @Description  根据 id 删除 bot 类型
// @Tags         BotType
// @Accept       json
// @Produce      json
// @Param		id query string true "bot 类型id"
// @Success      200  {object}  response.Response{data=bool}
// @Failure	     default {object}  errorx.CodeErrorResponse
// @Router       /bot/type/del [delete]
func DeleteBotTypeById(api fiber.Router) {
	api.Delete("/del", func(ctx *fiber.Ctx) error {
		id := ctx.Query("id")

		return database.Exec(func(db database.DataBase) error {
			err := db.DeleteBotTypeById(id)
			if err = errorx.ParseError(err); err != nil {
				return ctx.JSON(err)
			}
			return ctx.JSON(response.NewResponse(true))
		})
	})
}
