package middleware

import (
	"fmt"
	"github.com/UpmeshLTD/urus-aio/infrastructure/utils"
	"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 JWTClaims struct {
	jwt.StandardClaims
}

func NewSellerAuthMiddleware(authHort string, authPort int) gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Request.Header.Get("Authorization")
		var jwtClaims JWTClaims

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

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

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

		md := metadata.New(map[string]string{
			"service-name":  "user-service",
			"userworkspace": c.Request.Header.Get("userworkspace"),
			"authorization": token,
		})

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

		c.Next()
	}
}

func GetWorkspaceId(c *gin.Context) string {
	return c.Request.Header.Get("userworkspace")
}

func GetAcceptLanguage(c *gin.Context) string {
	return utils.FixAcceptLanguage(c.Request.Header.Get("Accept-Language"))
}
