package server

import (
	"context"
	"errors"
	"fmt"
	"madsky.ru/go-tracker/internal/model/user"
	"madsky.ru/go-tracker/internal/server/helpers"
	"madsky.ru/go-tracker/internal/server/response"
	"net/http"
)

type UserContext struct {
}

func (app *Application) AuthMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		cookie, err := r.Cookie("token")
		if err != nil {
			switch {
			case errors.Is(err, http.ErrNoCookie):
				response.Error(w, errors.New("no authentication token"), http.StatusForbidden)
			default:
				response.Error(w, errors.New("unknown error"), http.StatusForbidden)
			}
			return
		}

		claims, err := helpers.VerifyToken(cookie.Value)
		if err != nil {
			response.Error(w, errors.New("invalid authentication token"), http.StatusForbidden)
			return
		}

		u, err := app.Storage.User.FindById(app.Ctx, claims.UserId)
		if err != nil {
			response.Error(w, errors.New("user not found"), http.StatusBadRequest)
			return
		}
		ctx := context.WithValue(r.Context(), UserContext{}, u)
		next.ServeHTTP(w, r.WithContext(ctx))
	})

}

func (app *Application) LogRole(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		ctx := r.Context()
		u := ctx.Value(UserContext{}).(*user.User)

		isAdmin := u.Role == "admin"

		fmt.Println(fmt.Sprintf("is admin: %v", isAdmin))
		
		next.ServeHTTP(w, r)
	})
}
