// Copyright 2019 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.

// This file contains flag definitions for the config_parser package as well
// as all the functions which make direct use of these flags.
// TODO(azani): Refactor and test. This is half of the logic that was ripped out
// config_parser_main.go and it still needs to be refactored.
package config_parser

import (
	"flag"
	"fmt"
	"time"
)

var (
	repoUrl       = flag.String("repo_url", "", "URL of the repository containing the config. Exactly one of 'repo_url', 'config_file' or 'config_dir' must be specified.")
	configDir     = flag.String("config_dir", "", "Directory containing the config. Exactly one of 'repo_url', 'config_file' or 'config_dir' must be specified.")
	configFile    = flag.String("config_file", "", "File containing the config for a single project. Exactly one of 'repo_url', 'config_file' or 'config_dir' must be specified.")
	customerId    = flag.Int64("customer_id", -1, "Customer Id for the config to be read. Must be set if and only if 'config_file' is set.")
	projectId     = flag.Int64("project_id", -1, "Project Id for the config to be read. Must be set if and only if 'config_file' is set.")
	projectName   = flag.String("project_name", "", "Project name for the config to be read. Must be set if and only if 'config_dir' is set.")
	v1Project     = flag.Bool("v1_project", false, "Specified project is a Cobalt 1.0 project. Can be set if and only if 'config_file' is set.")
	gitTimeoutSec = flag.Int64("git_timeout", 60, "How many seconds should I wait on git commands?")
)

// checkFlags verifies that the specified flags are compatible with each other.
func checkFlags() error {
	if (*repoUrl == "") == (*configDir == "") == (*configFile == "") {
		return fmt.Errorf("Exactly one of 'repo_url', 'config_file' and 'config_dir' must be set.")
	}

	if *projectId >= 0 && *projectName != "" {
		return fmt.Errorf("Exactly one of 'project_id' and 'project_name' must be set.")
	}

	if *configFile == "" && *configDir == "" && (*customerId >= 0 || *projectId >= 0 || *projectName != "") {
		return fmt.Errorf("'customer_id' and 'project_(id/name)'  must be set if and only if 'config_file' or 'config_dir' are set.")
	}

	if *v1Project && *configFile == "" {
		return fmt.Errorf("'v1_project' can be set if and only if 'config_file' is set.")
	}

	if *configFile != "" && (*customerId < 0 || *projectId < 0) {
		return fmt.Errorf("If 'config_file' is set, both 'customer_id' and 'project_id' must be set.")
	}

	return nil
}

// ParseConfigFromFlags uses the specified flags to find the specified registry,
// read and parse it.
func ParseConfigFromFlags() ([]ProjectConfig, error) {
	if err := checkFlags(); err != nil {
		return nil, err
	}

	configs := []ProjectConfig{}
	var pc ProjectConfig
	var err error
	if *repoUrl != "" {
		gitTimeout := time.Duration(*gitTimeoutSec) * time.Second
		configs, err = ReadConfigFromRepo(*repoUrl, gitTimeout)
	} else if *configFile != "" {
		version := CobaltVersion0
		if *v1Project {
			version = CobaltVersion1
		}
		pc, err = ReadConfigFromYaml(*configFile, uint32(*customerId), uint32(*projectId), CobaltVersion(version))
		configs = append(configs, pc)
	} else if *customerId >= 0 && *projectId >= 0 {
		pc, err = ReadProjectConfigFromDir(*configDir, uint32(*customerId), uint32(*projectId))
		configs = append(configs, pc)
	} else if *customerId >= 0 && *projectName != "" {
		pc, err = ReadProjectConfigFromDirByName(*configDir, uint32(*customerId), *projectName)
		configs = append(configs, pc)
	} else {
		configs, err = ReadConfigFromDir(*configDir)
	}
	return configs, err
}

// GetConfigFilesListFromFlags returns a list of all the files that comprise
// the registry being parsed. This can be used to generate a depfile.
func GetConfigFilesListFromFlags() ([]string, error) {
	if err := checkFlags(); err != nil {
		return nil, err
	}
	if *configFile != "" {
		return []string{*configFile}, nil
	} else if *configDir != "" {
		return GetConfigFilesListFromConfigDir(*configDir)
	}
	return nil, fmt.Errorf("-dep_file requires -config_dir or -config_file")
}
