package api

import (
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

func isError(c *gin.Context, err error) bool {
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"details": err.Error(),
		})
		return true
	}
	return false
}

func raiseError(c *gin.Context, errCode int, message string) {
	c.AbortWithStatusJSON(errCode, gin.H{
		"details": message,
	})
}

func raiseBadRequestError(c *gin.Context, message string) {
	raiseError(c, http.StatusBadRequest, message)
}

func raiseNotFoundError(c *gin.Context, message string) {
	raiseError(c, http.StatusNotFound, message)
}

func raiseInternalError(c *gin.Context, message string) {
	c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
		"details": "Internal server error. We will we will fix it!",
	})
}

func corsMiddleware() gin.HandlerFunc {
	allowHeaders := [12]string{
		"Content-Type",
		"Content-Length",
		"Accept-Encoding",
		"X-CSRF-Token",
		"Authorization",
		"accept",
		"origin",
		"Cache-Control",
		"X-Requested-With",
		"x-timezone",
		"Access-Control-Allow-Origin",
		"Access-Control-Max-Age",
	}

	return func(c *gin.Context) {
		allowOrigin := "*"
		c.Writer.Header().Set("Access-Control-Allow-Origin", allowOrigin)
		c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
		c.Writer.Header().Set("Access-Control-Allow-Headers", strings.Join(allowHeaders[:], ", "))
		c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")

		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
			return
		}

		c.Next()
	}
}
