// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_LOGGING_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_LOGGING_H_

#include <memory>
#include <string>

#include "base/values.h"
#include "chrome/browser/web_applications/web_app_constants.h"
#include "chrome/browser/web_applications/web_app_id.h"
#include "chrome/browser/web_applications/web_app_install_info.h"
#include "chrome/browser/web_applications/web_app_url_loader.h"
#include "components/webapps/browser/installable/installable_metrics.h"

namespace web_app {

// This class is used to accumulate a single log entry
class InstallErrorLogEntry {
 public:
  explicit InstallErrorLogEntry(bool background_installation,
                                webapps::WebappInstallSource install_surface);
  ~InstallErrorLogEntry();

  // The InstallWebAppTask determines this after construction, so a setter is
  // required.
  void set_background_installation(bool background_installation) {
    background_installation_ = background_installation;
  }

  bool HasErrorDict() const { return !!error_dict_; }

  // Collects install errors (unbounded) if the |kRecordWebAppDebugInfo|
  // flag is enabled to be used by: chrome://web-app-internals
  base::Value TakeErrorDict();

  void LogUrlLoaderError(const char* stage,
                         const std::string& url,
                         WebAppUrlLoader::Result result);
  void LogExpectedAppIdError(const char* stage,
                             const std::string& url,
                             const AppId& app_id,
                             const AppId& expected_app_id);
  void LogDownloadedIconsErrors(
      const WebAppInstallInfo& web_app_info,
      IconsDownloadedResult icons_downloaded_result,
      const IconsMap& icons_map,
      const DownloadedIconsHttpResults& icons_http_results);

 private:
  void LogHeaderIfLogEmpty(const std::string& url);

  void LogErrorObject(const char* stage,
                      const std::string& url,
                      base::Value::Dict object);

  std::unique_ptr<base::Value::Dict> error_dict_;
  bool background_installation_;
  webapps::WebappInstallSource install_surface_;
};

}  // namespace web_app

#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_LOGGING_H_
