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

#ifndef TOOLS_GN_XCODE_WRITER_H_
#define TOOLS_GN_XCODE_WRITER_H_

#include <iosfwd>
#include <map>
#include <memory>
#include <string>
#include <vector>

#include "base/macros.h"

class Builder;
class BuildSettings;
class Err;
class SourceDir;
class Target;

using PBXAttributes = std::map<std::string, std::string>;
class PBXProject;

class XcodeWriter {
 public:
  enum TargetOsType {
    WRITER_TARGET_OS_IOS,
    WRITER_TARGET_OS_MACOS,
  };

  // Writes Xcode workspace and project files.
  //
  // |workspace_name| is the optional name of the workspace file name ("all"
  // is used if not specified). |root_target_name| is the name of the main
  // target corresponding to building "All" (for example "gn_all" in Chromium).
  // |ninja_extra_args| are additional arguments to pass to ninja invocation
  // (can be used to increase limit of concurrent processes when using goma).
  // |dir_filters_string| is optional semicolon-separated list of label patterns
  // used to limit the set of generated projects. Only matching targets will be
  // included to the workspace. On failure will populate |err| and return false.
  static bool RunAndWriteFiles(const std::string& workspace_name,
                               const std::string& root_target_name,
                               const std::string& ninja_extra_args,
                               const std::string& dir_filters_string,
                               const BuildSettings* build_settings,
                               const Builder& builder,
                               Err* err);

 private:
  XcodeWriter(const std::string& name);
  ~XcodeWriter();

  // Filters the list of targets to only return the targets with artifacts
  // usable from Xcode (mostly application bundles). On failure populate |err|
  // and return false.
  static bool FilterTargets(const BuildSettings* build_settings,
                            const std::vector<const Target*>& all_targets,
                            const std::string& dir_filters_string,
                            std::vector<const Target*>* targets,
                            Err* err);

  // Filters list of targets to only return ones that are xctest module bundles.
  static void FilterXCTestModuleTargets(
      const std::vector<const Target*>& targets,
      std::vector<const Target*>* xctest_module_targets);

  // Generate the "products.xcodeproj" project that reference all products
  // (i.e. targets that have a build artefact usable from Xcode, mostly
  // application bundles).
  void CreateProductsProject(const std::vector<const Target*>& targets,
                             const PBXAttributes& attributes,
                             const std::string& source_path,
                             const std::string& config_name,
                             const std::string& root_target,
                             const std::string& ninja_extra_args,
                             const BuildSettings* build_settings,
                             TargetOsType target_os);

  // Generates the "sources.xcodeproj" project that reference all source
  // files to allow Xcode to index them.
  void CreateSourcesProject(const std::vector<const Target*>& targets,
                            const SourceDir& root_build_dir,
                            const PBXAttributes& attributes,
                            const std::string& source_path,
                            const std::string& absolute_source_path,
                            const std::string& config_name,
                            TargetOsType target_os);

  bool WriteFiles(const BuildSettings* build_settings, Err* err);
  bool WriteProjectFile(const BuildSettings* build_settings,
                        PBXProject* project,
                        Err* err);

  void WriteWorkspaceContent(std::ostream& out);
  void WriteProjectContent(std::ostream& out, PBXProject* project);

  std::string name_;
  std::vector<std::unique_ptr<PBXProject>> projects_;

  DISALLOW_COPY_AND_ASSIGN(XcodeWriter);
};

#endif  // TOOLS_GN_XCODE_WRITER_H_
