// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"context"
	"flag"
	"fmt"
	"os"
	"time"

	subcommands "github.com/google/subcommands"
	fg "go.fuchsia.dev/fuchsia/tools/femu-control/femu-grpc"
)

var (
	server_addr = flag.String("server", "localhost", "server address")
	server_port = flag.Int("port", 5556, "gRPC port")
	timeout     = flag.Duration("timeout", 1*time.Second, "gRPC connection timeout")
)

func newClient() (fg.FemuGrpcClientInterface, error) {
	config := fg.FemuGrpcClientConfig{
		ServerAddr: fmt.Sprintf("%s:%d", *server_addr, *server_port),
		Timeout:    *timeout,
	}

	client, err := fg.NewFemuGrpcClient(config)
	if err != nil {
		return nil, err
	}

	return &client, nil
}

func main() {
	subcommands.Register(subcommands.HelpCommand(), "")
	subcommands.Register(subcommands.FlagsCommand(), "")
	subcommands.Register(subcommands.CommandsCommand(), "")
	subcommands.Register(&recordAudioCmd{}, "")
	subcommands.Register(&recordScreenCmd{}, "")
	subcommands.Register(&keyboardCmd{}, "")
	flag.Parse()

	client, err := newClient()
	if err != nil {
		panic(fmt.Sprintf("error while creating gRPC client: %v", err))
	}
	ctx := context.WithValue(context.Background(), "client", client)
	os.Exit(int(subcommands.Execute(ctx)))
}
