package ooapi

import (
	"crypto/rand"
	"encoding/base64"
	"time"

	"github.com/ooni/probe-cli/v3/internal/ooapi/apimodel"
	"github.com/ooni/probe-cli/v3/internal/runtimex"
)

// loginState is the struct saved in the kvstore
// to keep track of the login state.
type loginState struct {
	ClientID string
	Expire   time.Time
	Password string
	Token    string
}

func (ls *loginState) credentialsValid() bool {
	return ls.ClientID != "" && ls.Password != ""
}

func (ls *loginState) tokenValid() bool {
	return ls.Token != "" && time.Now().Add(60*time.Second).Before(ls.Expire)
}

// loginKey is the key with which loginState is saved
// into the key-value store used by Client.
const loginKey = "orchestra.state"

// newRandomPassword generates a new random password.
func newRandomPassword() string {
	b := make([]byte, 48)
	_, err := rand.Read(b)
	runtimex.PanicOnError(err, "rand.Read failed")
	return base64.StdEncoding.EncodeToString(b)
}

// newRegisterRequest creates a new RegisterRequest.
func newRegisterRequest(password string) *apimodel.RegisterRequest {
	return &apimodel.RegisterRequest{
		// The original implementation has as its only use case that we
		// were registering and logging in for sending an update regarding
		// the probe whereabouts. Yet here in probe-engine, the orchestra
		// is currently only used to fetch inputs. For this purpose, we don't
		// need to communicate any specific information. The code that will
		// perform an update used to be responsible of doing that. Now, we
		// are not using orchestra for this purpose anymore.
		Platform:        "miniooni",
		ProbeASN:        "AS0",
		ProbeCC:         "ZZ",
		SoftwareName:    "miniooni",
		SoftwareVersion: "0.1.0-dev",
		SupportedTests:  []string{"web_connectivity"},
		Password:        password,
	}
}
