package recaptcha

import (
	"encoding/json"
	"io"
	"net/http"
	"net/url"
)

var (
	RecaptchaBaseURL string = "https://www.google.com/recaptcha/api/siteverify"
)

type GoogleRecaptchaResponse struct {
	Success            bool     `json:"success"`
	ChallengeTimestamp string   `json:"challenge_ts"`
	Hostname           string   `json:"hostname"`
	ErrorCodes         []string `json:"error-codes"`
}

type RecaptchaHandle struct {
	HttpClient *http.Client
	Secret     string
}

func NewRecaptchaHandle(client *http.Client, secret string) *RecaptchaHandle {
	return &RecaptchaHandle{
		HttpClient: client,
		Secret:     secret,
	}
}

// This will handle the reCAPTCHA verification between your server to Google's server
func (r *RecaptchaHandle) ValidateReCAPTCHA(recaptchaResponse string) (bool, error) {
	// Check this URL verification details from Google
	// https://developers.google.com/recaptcha/docs/verify
	req, err := r.HttpClient.PostForm(RecaptchaBaseURL, url.Values{
		"secret":   {r.Secret},
		"response": {recaptchaResponse},
	})

	if err != nil {
		return false, err
	}
	defer req.Body.Close() // nolint
	body, err := io.ReadAll(req.Body)
	if err != nil {
		return false, err
	}

	var googleResponse GoogleRecaptchaResponse
	err = json.Unmarshal(body, &googleResponse)
	if err != nil {
		return false, err
	}
	return googleResponse.Success, nil
}
