package main

import (
	"bytes"
	"crypto/rand"
	"fmt"
	"math/big"
	"os"
	"path/filepath"
)

func main() {
	root := "."
	if len(os.Args) > 1 {
		root = os.Args[1]
	}
	files := make([]string, 0, 32)
	err := filepath.Walk(root, func(p string, f os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !f.IsDir() {
			files = append(files, p)
		}
		return nil
	})
	if err != nil {
		fmt.Fprintf(os.Stderr, "** Error: %s\n", err.Error())
		os.Exit(1)
	}
	var b [16]byte
	_, err = rand.Read(b[:])
	if err != nil {
		fmt.Fprintf(os.Stderr, "Failed to access cryptographic randomness.  " +
			"Error: %s\n\n", err.Error())
		os.Exit(1)
	}
	i, err := rand.Int(bytes.NewReader(b[:]), big.NewInt(int64(len(files))))
	if err != nil {
		fmt.Fprintf(os.Stderr, "Failed to get a random int.  Error: %s\n", err.Error())
		os.Exit(1)
	}
	j := int(i.Uint64())

	fmt.Printf("%s\n", files[j])
}