package auth

import (
	"context"
	"fmt"
	"time"

	"github.com/go-chi/jwtauth/v5"
)

var TokenAuth *jwtauth.JWTAuth

// AuthResponse is the response structure for login/refresh endpoints
type AuthResponse struct {
	Token string `json:"token"`
}

func InitJWT(secret string) {
	TokenAuth = jwtauth.New("HS256", []byte(secret), nil)
}

// GenerateToken creates a JWT with user_id and role
func GenerateToken(userID string, role string) (string, error) {
	_, tokenString, err := TokenAuth.Encode(map[string]interface{}{
		"user_id": userID,
		"role":    role,
		"exp":     time.Now().Add(30 * 24 * time.Hour).Unix(), // 30 days
	})
	return tokenString, err
}

// VerifyToken validates JWT and returns user_id and role
func VerifyToken(tokenString string, ctx context.Context) (userID string, role string, err error) {
	token, err := TokenAuth.Decode(tokenString)
	if err != nil {
		return "", "", err
	}

	var uidVal interface{}
	if err := token.Get("user_id", &uidVal); err != nil {
		return "", "", fmt.Errorf("invalid user_id claim")
	}
	userID, ok := uidVal.(string)
	if !ok {
		return "", "", fmt.Errorf("invalid user_id claim")
	}

	var roleVal interface{}
	if err := token.Get("role", &roleVal); err != nil {
		return "", "", fmt.Errorf("invalid role claim")
	}
	role, ok = roleVal.(string)
	if !ok {
		return "", "", fmt.Errorf("invalid role claim")
	}

	return userID, role, nil
}
