/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
package main

import (
	"github.com/apache/brooklyn-client/cli/app"
	"github.com/apache/brooklyn-client/cli/command_factory"
	"github.com/apache/brooklyn-client/cli/command_runner"
	"github.com/apache/brooklyn-client/cli/error_handler"
	"github.com/apache/brooklyn-client/cli/io"
	"github.com/apache/brooklyn-client/cli/net"
	"github.com/apache/brooklyn-client/cli/scope"
	"os"
	"path/filepath"
)

func main() {
	config := io.GetConfig()
	target, credentials, err := config.GetNetworkCredentials()
	authType, err := config.GetAuthType(target)
	if err != nil && requiresLogin(os.Args) {
		error_handler.ErrorExit(err)
	}


	//target, username, password := "http://192.168.50.101:8081", "brooklyn", "Sns4Hh9j7l"
	network := &net.Network{
		BrooklynUrl: target,
		Credentials: credentials,
		SkipSslChecks: config.GetSkipSslChecks(),
		AuthorizationType: authType,
		Verbosity: verbosity(os.Args),
	}
	cmdFactory := command_factory.NewFactory(network, config)

	args, scope := scope.ScopeArguments(os.Args)
	cmdRunner := command_runner.NewRunner(scope, cmdFactory)
	metaDatas := cmdFactory.CommandMetadatas()
	theApp := app.NewApp(filepath.Base(args[0]), cmdRunner, metaDatas...)
	if err := theApp.Run(args); nil != err {
		error_handler.ErrorExit(err)
	}
}

func requiresLogin(args []string) bool {
	// global help or version commands
	if (contains(args, "-h") ||
		contains(args, "--help") ||
	    contains(args, "-v") ||
	    contains(args, "--version")) {
		return false
	}
	// br on its own
	if (len(args) == 1) {
		return false
	}
	//
	if (len(args) > 1) {
		if (args[1] == "login" || args[1] == "help") {
			return false
		}
	}
	return true
}

func verbosity(args []string) string {
	if contains(args, "--vverbose") {
		return "vverbose"
	} else if contains(args, "--verbose") {
		return "verbose"
	} else {
		return "normal"
	}
}

func contains(slice []string, val string) bool {
	for _, a := range slice {
		if a == val {
			return true
		}
	}
	return false
}