package user

import (
	"encoding/base64"
	"encoding/json"
)

// nextPageToken exists solely for JSON marshaling/unmarshaling nextPage params.
// It is not exported because we want nextPageTokens to be opaque and not rely
// on any specific encoding. However, because this encoding happens to be useful
// for both the in-mem and DB repo, we export the {Encode,Decode}NextPageToken
// functions.
type nextPageToken struct {
	Filter     UserFilter
	MaxResults int
	Offset     int
}

func EncodeNextPageToken(filter UserFilter, maxResults int, offset int) (string, error) {
	tok := nextPageToken{
		Filter:     filter,
		MaxResults: maxResults,
		Offset:     offset,
	}

	b, err := json.Marshal(&tok)
	if err != nil {
		return "", err
	}

	enc := base64.URLEncoding.EncodeToString(b)
	return enc, nil
}

func DecodeNextPageToken(tok string) (UserFilter, int, int, error) {
	b, err := base64.URLEncoding.DecodeString(tok)
	if err != nil {
		return UserFilter{}, 0, 0, err
	}

	var npt nextPageToken
	err = json.Unmarshal(b, &npt)
	if err != nil {
		return UserFilter{}, 0, 0, err
	}

	return npt.Filter, npt.MaxResults, npt.Offset, nil
}