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

#include "tools/gn/create_bundle_target_generator.h"

#include "tools/gn/filesystem_utils.h"
#include "tools/gn/parse_tree.h"
#include "tools/gn/scope.h"
#include "tools/gn/substitution_type.h"
#include "tools/gn/target.h"
#include "tools/gn/value.h"
#include "tools/gn/variables.h"

CreateBundleTargetGenerator::CreateBundleTargetGenerator(
    Target* target,
    Scope* scope,
    const FunctionCallNode* function_call,
    Err* err)
    : TargetGenerator(target, scope, function_call, err) {}

CreateBundleTargetGenerator::~CreateBundleTargetGenerator() {}

void CreateBundleTargetGenerator::DoRun() {
  target_->set_output_type(Target::CREATE_BUNDLE);

  BundleData& bundle_data = target_->bundle_data();
  if (!GetBundleDir(std::string(),
                    variables::kBundleRootDir,
                    &bundle_data.root_dir()))
    return;
  if (!GetBundleDir(bundle_data.root_dir(),
                    variables::kBundleResourcesDir,
                    &bundle_data.resources_dir()))
    return;
  if (!GetBundleDir(bundle_data.root_dir(),
                    variables::kBundleExecutableDir,
                    &bundle_data.executable_dir()))
    return;
  if (!GetBundleDir(bundle_data.root_dir(),
                    variables::kBundlePlugInsDir,
                    &bundle_data.plugins_dir()))
    return;
}

bool CreateBundleTargetGenerator::GetBundleDir(
    const std::string& bundle_root_dir,
    const base::StringPiece& name,
    std::string* bundle_dir) {
  const Value* value = scope_->GetValue(name, true);
  if (!value)
    return true;
  if (!value->VerifyTypeIs(Value::STRING, err_))
    return false;
  const std::string& str = value->string_value();
  if (!EnsureStringIsInOutputDir(GetBuildSettings()->build_dir(), str,
                                 value->origin(), err_))
    return false;
  if (str != bundle_root_dir &&
      !IsStringInOutputDir(SourceDir(bundle_root_dir), str)) {
    *err_ = Err(value->origin(), "Path is not in bundle root dir.",
        "The given file should be in the bundle root directory or below.\n"
        "Normally you would do \"$bundle_root_dir/foo\". I interpreted this\n"
        "as \"" + str + "\".");
    return false;
  }
  bundle_dir->assign(value->string_value());
  return true;
}
