// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*
This file implements the client for the COS(Container-Optimized OS) Image update control plane.
It is reponsible for collecting and reporting the current instance status.

When run with the "monitor" command, it will perform initialization and then
periodically fetch update config from the API backend by sending the instance
status to the API.

When run with the "show_config" command, the current config applied to the system
is written to stdout.
Example Output:
		update_strategy: ""
		metrics_enabled: true
		health_monitor_config: <
			enforced: false
			logging_enabled: false
			monitoring_enabled: false
		>

*/

package main

import (
	"flag"
	"fmt"

	"policy-manager/cmd/monitor"
	"policy-manager/cmd/showconfig"

	"github.com/golang/glog"
)

// Command line flags for monitor mode.
var monitorModeFlags *flag.FlagSet

// Command line flags for show_config mode.
var showConfigModeFlags *flag.FlagSet

const (
	// Command names.
	monitorModeCommand = "monitor"
	showConfigCommand  = "show_config"
)

func init() {
	// Flags for monitor mode.
	monitorModeFlags = flag.NewFlagSet(monitorModeCommand, flag.ExitOnError)
	monitorModeFlags.Usage = func() {
		fmt.Println("Initialize and monitor changes to instance config periodically without terminating")
	}

	// Flags for show_config.
	showConfigModeFlags = flag.NewFlagSet(showConfigCommand, flag.ExitOnError)
	showConfigModeFlags.Usage = func() {
		fmt.Println("Prints the current device policy for this instance to stdout.")
	}

	// Log to stderr only by default
	flag.Set("logtostderr", "true")
}

func main() {
	flag.Usage = func() {
		fmt.Println("Usage: device_policy_manager [logging flags] command [args...]")
		fmt.Println("")

		fmt.Println("Supported logging flags:")
		flag.PrintDefaults()
		fmt.Println("")

		fmt.Printf("Supported commands:\n%s,%s\n",
			monitorModeCommand, showConfigCommand)
	}

	// Parse the glog flags.
	flag.Parse()

	// If no flags are left after the glog flags are processed, print usage
	// message and exit.
	if flag.NArg() == 0 {
		flag.Usage()
		return
	}

	// Get the command and the arguments for the command.
	command := flag.Arg(0)
	switch command {
	case monitorModeCommand:
		monitor.InitDevicePolicy()
		monitor.HandleMonitorCmd()
	case showConfigCommand:
		showconfig.HandleShowConfigCmd()
	default:
		glog.Errorf("Unrecognized command: %s\n", command)
		flag.Usage()
	}
}
