// Copyright 2014 The Bazel Authors. All rights reserved.
//
// 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.

#ifndef BAZEL_SRC_MAIN_CPP_OPTION_PROCESSOR_H_
#define BAZEL_SRC_MAIN_CPP_OPTION_PROCESSOR_H_

#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>

#include "src/main/cpp/rc_file.h"
#include "src/main/cpp/startup_options.h"
#include "src/main/cpp/util/exit_code.h"

namespace blaze {

class WorkspaceLayout;

// Broken down structure of the command line into logical components. The raw
// arguments should not be referenced after this structure exists. This
// breakdown should suffice to access the parts of the command line that the
// client cares about, notably the binary and startup startup options.
struct CommandLine {
  std::string path_to_binary;
  std::vector<std::string> startup_args;
  std::string command;
  std::vector<std::string> command_args;

  CommandLine(std::string path_to_binary_arg,
              std::vector<std::string> startup_args_arg,
              std::string command_arg,
              std::vector<std::string> command_args_arg)
      : path_to_binary(std::move(path_to_binary_arg)),
        startup_args(std::move(startup_args_arg)),
        command(std::move(command_arg)),
        command_args(std::move(command_args_arg)) {}
};

// Represents an option parsed from a blazerc file.
struct BlazercOption {
  std::string source_path;
  std::string command;
  std::string option;
};

// This class is responsible for parsing the command line of the Blaze binary,
// parsing blazerc files, and putting together the command that should be sent
// to the server.
class OptionProcessor {
 public:
  OptionProcessor(const WorkspaceLayout* workspace_layout,
                  std::unique_ptr<StartupOptions> default_startup_options);

  OptionProcessor(const WorkspaceLayout* workspace_layout,
                  std::unique_ptr<StartupOptions> default_startup_options,
                  const std::string& system_bazelrc_path);

  virtual ~OptionProcessor() {}

  // Returns the lower-case product name associated with this options processor.
  std::string GetLowercaseProductName() const;

  // Splits the arguments of a command line invocation.
  //
  // For instance:
  // output/bazel --foo --bar=42 --bar blah build --myflag value :mytarget
  //
  // returns a CommandLine structure with the following values:
  // result.path_to_binary = "output/bazel"
  // result.startup_args = {"--foo", "--bar=42", "--bar=blah"}
  // result.command = "build"
  // result.command_args = {"--myflag", "value", ":mytarget"}
  //
  // Note that result.startup_args is guaranteed to contain only valid
  // startup options (w.r.t. StartupOptions::IsUnary and
  // StartupOptions::IsNullary) and unary startup args of the form '--bar blah'
  // are rewritten as '--bar=blah' for uniformity.
  // In turn, the command and command args are not rewritten nor validated.
  //
  // If the method fails then error will contain the cause, otherwise error
  // remains untouched.
  virtual std::unique_ptr<CommandLine> SplitCommandLine(
      std::vector<std::string> args, std::string* error) const;

  static constexpr int MaxImportDepth = RcFile::MaxImportDepth;
  // Parse a command line and the appropriate blazerc files and stores the
  // results. This should be invoked only once per OptionProcessor object.
  blaze_exit_code::ExitCode ParseOptions(const std::vector<std::string>& args,
                                         const std::string& workspace,
                                         const std::string& cwd,
                                         std::string* error,
                                         int max_import_depth = MaxImportDepth);

  // Get the Blaze command to be executed.
  // Returns an empty string if no command was found on the command line.
  std::string GetCommand() const;

  // Gets the arguments to the command. This is put together from the default
  // options specified in the blazerc file(s), the command line, and various
  // bits and pieces of information about the environment the blaze binary is
  // executed in.
  std::vector<std::string> GetCommandArguments() const;

  // Gets the arguments explicitly provided by the user's command line.
  std::vector<std::string> GetExplicitCommandArguments() const;

  // Gets the options extracted from the blazerc files. Must only be called
  // after ParseOptions.
  std::vector<BlazercOption> GetParsedBlazercOptions() const;

  // Returns the underlying StartupOptions object with parsed values. Must
  // only be called after ParseOptions.
  virtual StartupOptions* GetParsedStartupOptions() const;

  // Prints a message about the origin of startup options. This should be called
  // if the server is not started or called, in case the options are related to
  // the failure. Otherwise, the server will handle any required logging.
  void PrintStartupOptionsProvenanceMessage() const;

  // Sets the build label.
  void SetBuildLabel(const std::string& build_label) {
    build_label_ = build_label;
  }

  // Parse the files in `blazercs` and return all options that need to be passed
  // to the server. The options are returned in the order they should be appear
  // on the command line (later options have precedence over earlier ones).
  static std::vector<BlazercOption> GetBlazercOptions(
      const std::string& cwd, const std::vector<RcFile*>& blazercs);

  // Constructs all synthetic command args that should be passed to the
  // server to configure blazerc options and client environment.
  static std::vector<std::string> GetBlazercAndEnvCommandArgs(
      const std::string& cwd, const std::vector<BlazercOption>& blazerc_options,
      const std::vector<std::string>& env);

  // Finds and parses the appropriate RcFiles:
  //   - system rc (unless --nosystem_rc)
  //   - workspace, %workspace%/.bazelrc (unless --noworkspace_rc, or we aren't
  //     in a workspace directory, indicated by an empty workspace parameter)
  //   - user, $HOME/.bazelrc (unless --nohome_rc)
  //   - command-line provided, if a value is passed with --bazelrc
  //   - `BAZELRC` environment variable, if non empty.
  virtual blaze_exit_code::ExitCode GetRcFiles(
      const WorkspaceLayout* workspace_layout, const std::string& workspace,
      const std::string& cwd, const CommandLine* cmd_line,
      std::vector<std::unique_ptr<RcFile>>* result_rc_files, std::string* error,
      int max_import_depth = MaxImportDepth) const;

 private:
  blaze_exit_code::ExitCode ParseStartupOptions(
      const std::vector<RcFile*>& rc_files, std::string* error);

  // An ordered list of command args that contain information about the
  // execution environment and the flags passed via the bazelrc files.
  std::vector<std::string> blazerc_and_env_command_args_;

  // After calling ParseOptions, this contains a list of options that originate
  // from bazelrc files. If multiple options are specified for the same command,
  // they are in the order they appear in the files.
  std::vector<BlazercOption> parsed_blazercs_;

  // The command line constructed after calling ParseOptions.
  std::unique_ptr<CommandLine> cmd_line_;

  const WorkspaceLayout* workspace_layout_;

  // The StartupOptions object defining the startup options which are accepted,
  // and, after ParseOptions has been called, their values.
  const std::unique_ptr<StartupOptions> startup_options_;

  // Whether or not ParseOptions has been called.
  bool parse_options_called_;

  // Path to the system-wide bazelrc configuration file.
  // This is configurable for testing purposes only.
  const std::string system_bazelrc_path_;

  // Build label for Bazel.
  std::string build_label_;
};

// Parses and returns the contents of the rc file.
blaze_exit_code::ExitCode ParseRcFile(
    const WorkspaceLayout* workspace_layout, const std::string& workspace,
    const std::string& rc_file_path, const std::string& build_label,
    const std::optional<SemVer>& sem_ver,
    std::unique_ptr<RcFile>* result_rc_file, std::string* error,
    int max_import_depth = OptionProcessor::MaxImportDepth);

blaze_exit_code::ExitCode ParseRcFile(
    const WorkspaceLayout* workspace_layout, const std::string& workspace,
    const std::string& rc_file_path, std::unique_ptr<RcFile>* result_rc_file,
    std::string* error, int max_import_depth = OptionProcessor::MaxImportDepth);

// Returns the list of environment variables in the form "KEY=value", with
// synthetic entries (Windows only) filtered out.
std::vector<std::string> GetProcessedEnv();

}  // namespace blaze

#endif  // BAZEL_SRC_MAIN_CPP_OPTION_PROCESSOR_H_
