package auth

import (
	"github.com/gofiber/fiber/v2"
	"gofiber.study.skcks.cn/common/errorx"
	"gofiber.study.skcks.cn/common/response"
	"gofiber.study.skcks.cn/controller/types"
	"gofiber.study.skcks.cn/global"
	"gofiber.study.skcks.cn/model/dto"
	"gofiber.study.skcks.cn/services/auth"
)

type Controller struct {
	*types.Controller
}

func (c *Controller) GetRouter() fiber.Router {
	return c.Router
}

func NewController(app *fiber.App) *Controller {
	return &Controller{
		Controller: types.NewController(app, "/auth"),
	}
}

// Login 	用户登录
//
// @Summary      用户登录
// @Description  用户登录
// @Tags         Auth
// @Accept       json
// @Produce      json
// @Param        vo    body    dto.Login true  "用户登录"
// @Success      200  {object}  response.Response{data=vo.Login}
// @Failure	     default {object}  errorx.CodeErrorResponse
// @Router       /auth/login [post]
func (c *Controller) Login() {
	c.Router.Post("login", func(ctx *fiber.Ctx) error {
		login := &dto.Login{}
		err := ctx.BodyParser(login)
		if err = errorx.ParseError(err); err != nil {
			return ctx.JSON(err)
		}

		result, err := auth.Services.Login(login)
		if err = errorx.ParseError(err); err != nil {
			return ctx.JSON(err)
		}

		return ctx.JSON(response.NewResponse(result))
	})
}

// RefreshToken 刷新令牌
//
// @Summary      刷新令牌
// @Description  刷新令牌
// @Tags         Auth
// @Accept       json
// @Produce      json
// @Param        vo    body    dto.RefreshToken true  "刷新令牌"
// @Success      200  {object}  response.Response{data=vo.Login}
// @Failure	     default {object}  errorx.CodeErrorResponse
// @Router       /auth/refreshToken [post]
func (c *Controller) RefreshToken() {
	c.Router.Post("refreshToken", func(ctx *fiber.Ctx) error {
		refresh := &dto.RefreshToken{}
		err := ctx.BodyParser(refresh)
		if err = errorx.ParseErrorWithCode(fiber.StatusInternalServerError, err); err != nil {
			return ctx.JSON(err)
		}

		err = global.ValidateStruct(refresh)
		if err = errorx.ParseErrorWithCode(fiber.StatusInternalServerError, err); err != nil {
			return ctx.JSON(err)
		}

		result, err := auth.Services.RefreshToken(refresh.RefreshToken)
		if err = errorx.ParseErrorWithCode(fiber.StatusUnauthorized, err); err != nil {
			return ctx.JSON(err)
		}

		return ctx.JSON(response.NewResponse(result))
	})
}
