package routes

import (
	"crypto/rand"
	"encoding/hex"
	"gifuu/tools"
	"net/http"
	"strconv"
	"time"
)

func GET_Challenge(w http.ResponseWriter, r *http.Request) {
	query := r.URL.Query()

	paramDifficulty, _ := strconv.Atoi(query.Get("difficulty"))
	if paramDifficulty < 18 {
		tools.SendClientError(w, r, tools.ERROR_CHALLENGE_TOO_EASY)
		return
	}

	// Create Session
	nonce := make([]byte, 16)
	if _, err := rand.Read(nonce); err != nil {
		tools.SendServerError(w, r, err)
		return
	}
	normal := hex.EncodeToString(nonce)
	expiry := time.Now().Add(5 * time.Minute).Unix()

	// Store Session
	tools.ChallengeAtomic.Lock()
	tools.ChallengeSession[normal] = tools.ChallengeSessionData{
		Expires:    expiry,
		Difficulty: paramDifficulty,
	}
	tools.ChallengeAtomic.Unlock()

	tools.SendJSON(w, r, http.StatusOK, map[string]any{
		"nonce":      normal,
		"difficulty": paramDifficulty,
		"expires":    expiry,
	})
}
