package utils

import (
	"fmt"
	"strings"

	"github.com/Kong/go-pdk"
)

func GetURI(kong *pdk.PDK) (string, error) {
	// TODO: fixed by qiffang
	return kong.Request.GetPath()
}

func GetMethod(kong *pdk.PDK) (string, error) {
	return kong.Request.GetMethod()
}

type AuthErr struct {
	err     error
	message string
	code    int
}

func NewAuthErr(code int, message string) *AuthErr {
	return &AuthErr{
		message: message,
		code:    code,
	}
}

func NewAuthErrWithErr(code int, message string, err error) *AuthErr {
	return &AuthErr{
		message: message,
		code:    code,
		err:     err,
	}
}

func (e *AuthErr) Code() int {
	return e.code
}

func (e *AuthErr) Message() string {
	return e.message
}

func (e *AuthErr) BytesMessage() []byte {
	return []byte(e.message)
}

func (e *AuthErr) Error() string {
	if e.err == nil {
		return fmt.Sprintf("code: %d, message: %s", e.code, e.message)
	}
	return fmt.Sprintf("code: %d, message: %s, err: %v", e.code, e.message, e.err)
}

func GetBearToken(kong *pdk.PDK) (string, bool) {
	header, err := kong.Request.GetHeader("Authorization")
	if err != nil {
		return "", false
	}

	parts := strings.SplitN(header, " ", 2)
	if len(parts) == 2 && parts[0] == "Bearer" {
		return parts[1], true
	}

	return "", false
}
