package http

import (
	"encoding/hex"
	"errors"
	"fmt"
	"net/http"

	"github.com/mediocregopher/blog.mediocregopher.com/srv/http/apiutil"
)

func (a *api) newPowChallengeHandler() http.Handler {
	return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {

		challenge := a.params.PowManager.NewChallenge()

		apiutil.JSONResult(rw, r, struct {
			Seed   string `json:"seed"`
			Target uint32 `json:"target"`
		}{
			Seed:   hex.EncodeToString(challenge.Seed),
			Target: challenge.Target,
		})
	})
}

func (a *api) requirePowMiddleware(h http.Handler) http.Handler {
	return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {

		seedHex := r.FormValue("powSeed")
		seed, err := hex.DecodeString(seedHex)
		if err != nil || len(seed) == 0 {
			apiutil.BadRequest(rw, r, errors.New("invalid powSeed"))
			return
		}

		solutionHex := r.FormValue("powSolution")
		solution, err := hex.DecodeString(solutionHex)
		if err != nil || len(seed) == 0 {
			apiutil.BadRequest(rw, r, errors.New("invalid powSolution"))
			return
		}

		err = a.params.PowManager.CheckSolution(seed, solution)

		if err != nil {
			apiutil.BadRequest(rw, r, fmt.Errorf("checking proof-of-work solution: %w", err))
			return
		}

		h.ServeHTTP(rw, r)
	})
}
