package middleware

import (
	"log"
	"net/http"

	"gitea.local/admin/hspguard/internal/repository"
	"gitea.local/admin/hspguard/internal/util"
	"gitea.local/admin/hspguard/internal/web"
	"github.com/google/uuid"
)

type AdminMiddleware struct {
	repo *repository.Queries
}

func NewAdminMiddleware(repo *repository.Queries) *AdminMiddleware {
	return &AdminMiddleware{
		repo,
	}
}

func (m *AdminMiddleware) Runner(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		userId, ok := util.GetRequestUserId(r.Context())
		if !ok {
			log.Println("ERR: Could not get user id from request")
			web.Error(w, "not authenticated", http.StatusUnauthorized)
			return
		}

		user, err := m.repo.FindUserId(r.Context(), uuid.MustParse(userId))
		if err != nil {
			log.Println("ERR: User with provided id does not exist:", userId)
			web.Error(w, "not authenticated", http.StatusUnauthorized)
			return
		}

		if !user.IsAdmin {
			log.Println("INFO: User is not admin")
			web.Error(w, "no priviligies to access this resource", http.StatusForbidden)
			return
		}

		next.ServeHTTP(w, r)
	})
}
