package testing

import (
	"fmt"
	"os"
	"strconv"

	pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
	"github.com/prysmaticlabs/prysm/shared/testutil"
)

const fileBase = "0-11-0/mainnet/beaconstate"
const fileBaseENV = "BEACONSTATES_PATH"

// GetBeaconFuzzState returns a beacon state by ID using the beacon-fuzz corpora.
func GetBeaconFuzzState(ID uint16) (*pb.BeaconState, error) {
	base := fileBase
	// Using an environment variable allows a host image to specify the path when only the binary
	// executable was uploaded (without the runfiles). i.e. fuzzit's platform.
	if p, ok := os.LookupEnv(fileBaseENV); ok {
		base = p
	}
	ok, err := testutil.BazelDirectoryNonEmpty(base)
	if err != nil {
		panic(err)
	}
	if !ok {
		panic(fmt.Sprintf("Beacon states directory (%s) does not exist or has no files.", base))
	}
	b, err := testutil.BazelFileBytes(base, strconv.Itoa(int(ID)))
	if err != nil {
		return nil, err
	}
	st := &pb.BeaconState{}
	if err := st.UnmarshalSSZ(b); err != nil {
		return nil, err
	}
	return st, nil
}
