// 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 "mojo/tools/package_manager/package_manager_application.h"

#include "base/files/file_util.h"
#include "mojo/tools/package_manager/manifest.h"
#include "mojo/tools/package_manager/unpacker.h"
#include "base/message_loop/message_loop.h"
#include "base/stl_util.h"
#include "mojo/public/cpp/application/application_impl.h"

namespace mojo {

namespace {

const base::FilePath::CharType kManifestFileName[] =
    FILE_PATH_LITERAL("manifest.json");

}  // namespace

PackageManagerApplication::PendingLoad::PendingLoad() {
}

PackageManagerApplication::PendingLoad::~PendingLoad() {
}

PackageManagerApplication::PackageManagerApplication() {
}

PackageManagerApplication::~PackageManagerApplication() {
  STLDeleteContainerPairSecondPointers(pending_.begin(), pending_.end());
}

void PackageManagerApplication::Initialize(ApplicationImpl* app) {
  app->ConnectToService("mojo:network_service", &network_service_);

  printf("Enter URL> ");
  char buf[1024];
  if (scanf("%1023s", buf) != 1) {
    printf("No input, exiting\n");
    base::MessageLoop::current()->Quit();
    return;
  }
  GURL url(buf);
  if (!url.is_valid()) {
    printf("Invalid URL\n");
    base::MessageLoop::current()->Quit();
    return;
  }

  StartLoad(url);
}

void PackageManagerApplication::StartLoad(const GURL& url) {
  if (completed_.find(url) != completed_.end() ||
      pending_.find(url) != pending_.end())
    return;  // Already loaded or are loading this one.

  PendingLoad* load = new PendingLoad;
  load->fetcher.reset(new mojo::PackageFetcher(
      network_service_.get(), this, url));
  pending_[url] = load;
}

void PackageManagerApplication::LoadDeps(const Manifest& manifest) {
  for (size_t i = 0; i < manifest.deps().size(); i++)
    StartLoad(manifest.deps()[i]);
}

void PackageManagerApplication::PendingLoadComplete(const GURL& url) {
  pending_.erase(pending_.find(url));
  completed_.insert(url);
  if (pending_.empty())
    base::MessageLoop::current()->Quit();
}

void PackageManagerApplication::FetchSucceeded(
    const GURL& url,
    const base::FilePath& name) {
  Unpacker unpacker;
  if (!unpacker.Unpack(name)) {
    base::DeleteFile(name, false);
    printf("Failed to unpack\n");
    PendingLoadComplete(url);
    return;
  }
  // The downloaded .zip file is no longer necessary.
  base::DeleteFile(name, false);

  // Load the manifest.
  base::FilePath manifest_path = unpacker.dir().Append(kManifestFileName);
  Manifest manifest;
  std::string err_msg;
  if (!manifest.ParseFromFile(manifest_path, &err_msg)) {
    printf("%s\n", err_msg.c_str());
    PendingLoadComplete(url);
    return;
  }

  // Enqueue loads for any deps.
  LoadDeps(manifest);

  printf("Loaded %s\n", url.spec().c_str());
  PendingLoadComplete(url);
}

void PackageManagerApplication::FetchFailed(const GURL& url) {
  PendingLoadComplete(url);
}

}  // namespace mojo
