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

#ifndef COMPONENTS_FEEDBACK_FEEDBACK_DATA_H_
#define COMPONENTS_FEEDBACK_FEEDBACK_DATA_H_

#include <memory>
#include <string>

#include "base/callback.h"
#include "base/macros.h"
#include "components/feedback/feedback_common.h"
#include "components/feedback/feedback_uploader.h"
#include "url/gurl.h"

namespace base {
class RefCountedString;
}
namespace content {
class BrowserContext;
}

namespace feedback {

class FeedbackData : public FeedbackCommon {
 public:
  FeedbackData(feedback::FeedbackUploader* uploader);

  // Called once we've updated all the data from the feedback page.
  void OnFeedbackPageDataComplete();

  // Sets the system information for this instance and kicks off its
  // compression.
  void SetAndCompressSystemInfo(std::unique_ptr<SystemLogsMap> sys_info);

  // Sets the attached file data and kicks off its compression.
  void AttachAndCompressFileData(
      std::unique_ptr<std::string> attached_filedata);

  // Returns true if we've completed all the tasks needed before we can send
  // feedback - at this time this is includes getting the feedback page data
  // and compressing the system logs.
  bool IsDataComplete();

  // Sends the feedback report if we have all our data complete.
  void SendReport();

  // Getters
  content::BrowserContext* context() const { return context_; }
  const std::string& attached_file_uuid() const { return attached_file_uuid_; }
  const std::string& screenshot_uuid() const { return screenshot_uuid_; }
  bool from_assistant() const { return from_assistant_; }
  bool assistant_debug_info_allowed() const {
    return assistant_debug_info_allowed_;
  }

  // Setters
  void set_context(content::BrowserContext* context) { context_ = context; }
  void set_attached_filename(const std::string& attached_filename) {
    attached_filename_ = attached_filename;
  }
  void set_attached_file_uuid(const std::string& uuid) {
    attached_file_uuid_ = uuid;
  }
  void set_screenshot_uuid(const std::string& uuid) {
    screenshot_uuid_ = uuid;
  }
  void set_trace_id(int trace_id) { trace_id_ = trace_id; }
  void set_from_assistant(bool from_assistant) {
    from_assistant_ = from_assistant;
  }
  void set_assistant_debug_info_allowed(bool assistant_debug_info_allowed) {
    assistant_debug_info_allowed_ = assistant_debug_info_allowed;
  }

 private:
  ~FeedbackData() override;

  // Called once a compression operation is complete.
  void OnCompressComplete();

  void OnGetTraceData(int trace_id,
                      scoped_refptr<base::RefCountedString> trace_data);

  feedback::FeedbackUploader* uploader_;  // Not owned.

  content::BrowserContext* context_;

  std::string attached_filename_;
  std::string attached_file_uuid_;
  std::string screenshot_uuid_;

  int trace_id_;

  int pending_op_count_;
  bool report_sent_;
  bool from_assistant_;
  bool assistant_debug_info_allowed_;

  DISALLOW_COPY_AND_ASSIGN(FeedbackData);
};

}  // namespace feedback

#endif  // COMPONENTS_FEEDBACK_FEEDBACK_DATA_H_
