// Copyright 2013 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 "chrome/browser/extensions/api/feedback_private/feedback_service.h"

#include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/statistics_recorder.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/system_logs/scrubbed_system_logs_fetcher.h"

using extensions::api::feedback_private::SystemInformation;

namespace extensions {

class FeedbackServiceImpl
    : public FeedbackService,
      public base::SupportsWeakPtr<FeedbackServiceImpl> {
 public:
  FeedbackServiceImpl();
  virtual ~FeedbackServiceImpl();

  virtual std::string GetUserEmail() OVERRIDE;
  virtual void GetSystemInformation(
      const GetSystemInformationCallback& callback) OVERRIDE;
  virtual void GetHistograms(std::string* histograms) OVERRIDE;

 private:
  void ProcessSystemLogs(scoped_ptr<chromeos::SystemLogsResponse> sys_info);

  // Overridden from FeedbackService:
  virtual base::WeakPtr<FeedbackService> GetWeakPtr() OVERRIDE;

  DISALLOW_COPY_AND_ASSIGN(FeedbackServiceImpl);
};

FeedbackService* FeedbackService::CreateInstance() {
  return new FeedbackServiceImpl;
}

FeedbackServiceImpl::FeedbackServiceImpl() {
}

FeedbackServiceImpl::~FeedbackServiceImpl() {
}

std::string FeedbackServiceImpl::GetUserEmail() {
  chromeos::UserManager* manager = chromeos::UserManager::Get();
  if (!manager)
    return std::string();
  else
    return manager->GetLoggedInUser()->display_email();
}

void FeedbackServiceImpl::GetSystemInformation(
    const GetSystemInformationCallback& callback) {
  system_information_callback_ = callback;

  chromeos::ScrubbedSystemLogsFetcher* fetcher =
      new chromeos::ScrubbedSystemLogsFetcher();
  fetcher->Fetch(base::Bind(&FeedbackServiceImpl::ProcessSystemLogs,
                            AsWeakPtr()));
}

void FeedbackServiceImpl::GetHistograms(std::string* histograms) {
  *histograms = base::StatisticsRecorder::ToJSON(std::string());
}

void FeedbackServiceImpl::ProcessSystemLogs(
    scoped_ptr<chromeos::SystemLogsResponse> sys_info_map) {
  SystemInformationList sys_info_list;
  if (!sys_info_map.get()) {
    system_information_callback_.Run(sys_info_list);
    return;
  }

  for (chromeos::SystemLogsResponse::iterator it = sys_info_map->begin();
       it != sys_info_map->end(); ++it)
    FeedbackService::PopulateSystemInfo(&sys_info_list, it->first, it->second);

  system_information_callback_.Run(sys_info_list);
}

base::WeakPtr<FeedbackService> FeedbackServiceImpl::GetWeakPtr() {
  return AsWeakPtr();
}

}  // namespace extensions
