package utils

import (
	"net/http"
	"strings"

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

func GetClientIP(c *gin.Context) string {
	realIP := c.GetHeader("X-Forwarded-For")
	if realIP != "" {
		ips := strings.Split(realIP, ",")
		for _, ip := range ips {
			ip = strings.TrimSpace(ip)
			if ip != "" && ip != "127.0.0.1" {
				return ip
			}
		}
	}

	realIP = c.GetHeader("X-Real-IP")
	if realIP != "" && realIP != "127.0.0.1" {
		return realIP
	}

	return c.ClientIP()
}

type ZiUtil struct{}

var Zi = &ZiUtil{}

func (z *ZiUtil) Exit(c *gin.Context, code int, message string, data interface{}) {
	c.JSON(http.StatusOK, gin.H{
		"code":    code,
		"message": message,
		"data":    data,
	})
}

func (z *ZiUtil) Echo(c *gin.Context, data interface{}) {
	Zi.Exit(c, 200, "ok", data)
}

func (z *ZiUtil) Error(c *gin.Context, message string, code ...int) {
	errCode := 100001
	if len(code) > 0 {
		errCode = code[0]
	}
	Zi.Exit(c, errCode, message, gin.H{})
}

func (z *ZiUtil) Debug(c *gin.Context, data interface{}) {
	Zi.Exit(c, 100000, "debug", data)
}

func (z *ZiUtil) Html(c *gin.Context, name string, data interface{}) {
	c.HTML(200, name, data)
}
