package response

import (
	"github.com/gofiber/fiber/v2"
)

type Response struct {
	Success bool        `json:"success"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`
	Meta    interface{} `json:"meta,omitempty"`
}

type PaginationMeta struct {
	CurrentPage int   `json:"current_page"`
	TotalPage   int   `json:"total_page"`
	TotalItems  int64 `json:"total_items"`
	PerPage     int   `json:"per_page"`
}

func Success(c *fiber.Ctx, status int, message string, data interface{}, meta ...interface{}) error {
	var m interface{}
	if len(meta) > 0 {
		m = meta[0]
	}
	return c.Status(status).JSON(Response{
		Success: true,
		Message: message,
		Data:    data,
		Meta:    m,
	})
}

func Error(c *fiber.Ctx, status int, message string) error {
	return c.Status(status).JSON(Response{
		Success: false,
		Message: message,
	})
}

func OK(c *fiber.Ctx, message string, data interface{}, meta ...interface{}) error {
	return Success(c, fiber.StatusOK, message, data, meta...)
}

func Created(c *fiber.Ctx, message string, data interface{}, meta ...interface{}) error {
	return Success(c, fiber.StatusCreated, message, data, meta...)
}

func BadRequest(c *fiber.Ctx, message string) error {
	return Error(c, fiber.StatusBadRequest, message)
}

func Unauthorized(c *fiber.Ctx, message string) error {
	return Error(c, fiber.StatusUnauthorized, message)
}

func Forbidden(c *fiber.Ctx, message string) error {
	return Error(c, fiber.StatusForbidden, message)
}

func NotFound(c *fiber.Ctx, message string) error {
	return Error(c, fiber.StatusNotFound, message)
}

func InternalError(c *fiber.Ctx, message string) error {
	return Error(c, fiber.StatusInternalServerError, message)
}
