package middleware

import (
	"fmt"
	"net/http"
	"strings"

	"github.com/UpmeshLTD/urus-aio/infrastructure/server/transport/http/gin/middleware/pb"
	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/metadata"
)

type JWTBuyerClaims struct {
	NameID string `json:"nameid"`
	jwt.StandardClaims
}

func NewBuyerAuthMiddleware(authHost string, authPort int) gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Request.Header.Get("Authorization")

		conn, err := grpc.Dial(
			fmt.Sprintf("%s:%d", authHost, authPort),
			grpc.WithTransportCredentials(insecure.NewCredentials()),
		)
		if err != nil {
			panic(err)
		}

		authSrv := pb.NewBuyerServiceClient(conn)
		defer conn.Close()

		md := metadata.New(map[string]string{
			"service-name":  "buyer-service",
			"authorization": token,
		})

		_, err = authSrv.GetBuyerProfile(
			metadata.NewOutgoingContext(c, md),
			&pb.GetBuyerProfileRequest{},
		)
		if err != nil {
			c.AbortWithStatus(http.StatusUnauthorized)
			return
		}

		c.Next()
	}
}

func GetBuyerId(c *gin.Context) string {
	token := c.Request.Header.Get("Authorization")
	var jwtClaims JWTBuyerClaims

	_, _ = jwt.ParseWithClaims(
		strings.Replace(token, "Bearer ", "", 1),
		&jwtClaims,
		func(token *jwt.Token) (interface{}, error) {
			return true, nil
		})

	return jwtClaims.NameID
}
