package main

import (
	"log"
	"math/rand"
	"net"

	"golang.org/x/net/context"
	"google.golang.org/grpc"
	pb "v.io/x/ref/examples/grpc-fortune/proto"
	"v.io/x/ref/examples/grpc-fortune/vgrpc"
)

const (
	port = ":50053"
)

var (
	fortunes = []string{
		"앞으로 소녀시대 직접 만날 거예요",
		"혼자 죽을 거예요",
		"오래살고 돈 많아 벌 거예요",
	}
	random = rand.New(rand.NewSource(99))
)

// TODO(krakauer): Add mutexes once the auth stuff works.

type server struct{}

func (s *server) Get(ctx context.Context, in *pb.FortuneGetRequest) (*pb.FortuneGetResponse, error) {
	log.Printf("Returing from Get now.")
	return &pb.FortuneGetResponse{
		Fortune: fortunes[random.Intn(len(fortunes))],
	}, nil
}

func (s *server) Add(ctx context.Context, in *pb.FortuneAddRequest) (*pb.FortuneAddResponse, error) {
	fortunes = append(fortunes, in.Fortune)
	return &pb.FortuneAddResponse{Succeeded: true}, nil
}

func (s *server) Has(ctx context.Context, in *pb.FortuneHasRequest) (*pb.FortuneHasResponse, error) {
	for _, f := range fortunes {
		if f == in.Fortune {
			return &pb.FortuneHasResponse{Has: true}, nil
		}
	}
	return &pb.FortuneHasResponse{Has: false}, nil
}

func main() {
	lis, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer(grpc.Creds(&vgrpc.VanadiumCred{}))
	pb.RegisterFortuneServer(s, &server{})
	s.Serve(lis)
}
