// Copyright 2014 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 "shell/mojo_url_resolver.h"

#include "base/base_paths.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "shell/filename_util.h"
#include "url/url_util.h"

namespace mojo {
namespace shell {
namespace {

GURL AddTrailingSlashIfNeeded(const GURL& url) {
  if (!url.has_path() || *url.path().rbegin() == '/')
    return url;

  std::string path(url.path() + '/');
  GURL::Replacements replacements;
  replacements.SetPathStr(path);
  return url.ReplaceComponents(replacements);
}

}  // namespace

MojoURLResolver::MojoURLResolver() {
  // Needed to treat first component of mojo URLs as host, not path.
  url::AddStandardScheme("mojo");
  // By default assume that the local apps reside alongside the shell.
  base::FilePath path;
  PathService::Get(base::DIR_MODULE, &path);
  local_apps_url_ = AddTrailingSlashIfNeeded(FilePathToFileURL(path));
}

MojoURLResolver::~MojoURLResolver() {
}

void MojoURLResolver::SetBaseURL(const GURL& base_url) {
  DCHECK(base_url.is_valid());
  // Force a trailing slash on the base_url to simplify resolving
  // relative files and URLs below.
  base_url_ = AddTrailingSlashIfNeeded(base_url);
}

void MojoURLResolver::SetLocalAppsPath(const base::FilePath& local_apps_path) {
  local_apps_url_ =
      AddTrailingSlashIfNeeded(FilePathToFileURL(local_apps_path));
  DCHECK(local_apps_url_.is_valid());
}

void MojoURLResolver::AddCustomMapping(const GURL& mojo_url,
                                       const GURL& resolved_url) {
  url_map_[mojo_url] = resolved_url;
}

void MojoURLResolver::AddLocalFileMapping(const GURL& mojo_url) {
  local_file_set_.insert(mojo_url);
}

GURL MojoURLResolver::Resolve(const GURL& mojo_url) const {
  const GURL mapped_url(ApplyCustomMappings(mojo_url));

  // Continue resolving if the mapped url is a mojo: url.
  if (mapped_url.scheme() != "mojo")
    return mapped_url;

  std::string lib = mapped_url.host() + ".mojo";

  if (!base_url_.is_valid() ||
      local_file_set_.find(mapped_url) != local_file_set_.end()) {
    // Resolve to a local file URL.
    return local_apps_url_.Resolve(lib);
  }

  // Otherwise, resolve to an URL relative to base_url_.
  return base_url_.Resolve(lib);
}

GURL MojoURLResolver::ApplyCustomMappings(const GURL& url) const {
  GURL mapped_url(url);
  for (;;) {
    std::map<GURL, GURL>::const_iterator it = url_map_.find(mapped_url);
    if (it == url_map_.end())
      break;
    mapped_url = it->second;
  }
  return mapped_url;
}

}  // namespace shell
}  // namespace mojo
