// 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_contents/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::Dict 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_
