// Copyright 2016 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_COMPONENT_UPDATER_UPDATER_STATE_H_
#define CHROME_BROWSER_COMPONENT_UPDATER_UPDATER_STATE_H_

#include <memory>
#include <string>

#include "base/containers/flat_map.h"
#include "base/gtest_prod_util.h"
#include "base/strings/string_piece_forward.h"
#include "base/time/time.h"
#include "base/values.h"
#include "base/version.h"
#include "build/build_config.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace component_updater {

class UpdaterState {
 public:
  using Attributes = base::flat_map<std::string, std::string>;

  // Returns a map of items representing the state of an updater.
  // If |is_machine| is true, this indicates that the updater state corresponds
  // to the machine instance of the updater. Returns nullptr on
  // the platforms and builds where this feature is not supported.
  static Attributes GetState(bool is_machine);

  ~UpdaterState();

 private:
  FRIEND_TEST_ALL_PREFIXES(UpdaterStateTest, SerializeChromePerUser);
  FRIEND_TEST_ALL_PREFIXES(UpdaterStateTest, SerializeChromium);
  FRIEND_TEST_ALL_PREFIXES(UpdaterStateTest, UpdaterNamePerUser);

  struct State {
    State();
    State(const State&);
    State& operator=(const State&);
    ~State();

    std::string updater_name;
    base::Version updater_version;
    base::Time last_autoupdate_started;
    base::Time last_checked;
    bool is_autoupdate_check_enabled = false;
    int update_policy = 0;
  };

  class StateReader {
   public:
    static std::unique_ptr<StateReader> Create(bool is_machine);

    // Returns the state of the Chrome updater.
    State Read(bool is_machine) const;

    virtual ~StateReader() = default;

   private:
    virtual std::string GetUpdaterName() const = 0;
    virtual base::Version GetUpdaterVersion(bool is_machine) const = 0;
    virtual bool IsAutoupdateCheckEnabled() const = 0;
    virtual base::Time GetUpdaterLastStartedAU(bool is_machine) const = 0;
    virtual base::Time GetUpdaterLastChecked(bool is_machine) const = 0;
    virtual int GetUpdatePolicy() const = 0;
  };

#if BUILDFLAG(IS_MAC)
  class StateReaderKeystone final : public StateReader {
   private:
    // Overrides for StateReader.
    std::string GetUpdaterName() const override;
    base::Version GetUpdaterVersion(bool is_machine) const override;
    bool IsAutoupdateCheckEnabled() const override;
    base::Time GetUpdaterLastStartedAU(bool is_machine) const override;
    base::Time GetUpdaterLastChecked(bool is_machine) const override;
    int GetUpdatePolicy() const override;
  };
#elif BUILDFLAG(IS_WIN)
  class StateReaderOmaha final : public StateReader {
   private:
    // Overrides for StateReader.
    std::string GetUpdaterName() const override;
    base::Version GetUpdaterVersion(bool is_machine) const override;
    bool IsAutoupdateCheckEnabled() const override;
    base::Time GetUpdaterLastStartedAU(bool is_machine) const override;
    base::Time GetUpdaterLastChecked(bool is_machine) const override;
    int GetUpdatePolicy() const override;
  };
#endif
  class StateReaderChromiumUpdater final : public StateReader {
   public:
    explicit StateReaderChromiumUpdater(base::Value::Dict parsed_json);

   private:
    // Overrides for StateReader.
    std::string GetUpdaterName() const override;
    base::Version GetUpdaterVersion(bool is_machine) const override;
    bool IsAutoupdateCheckEnabled() const override;
    base::Time GetUpdaterLastStartedAU(bool is_machine) const override;
    base::Time GetUpdaterLastChecked(bool is_machine) const override;
    int GetUpdatePolicy() const override;

    base::Time FindTimeKey(base::StringPiece key) const;
    const base::Value::Dict parsed_json_;
  };

  explicit UpdaterState(bool is_machine);

  // Builds the map of state attributes by serializing the state of this object.
  Attributes Serialize() const;

  static absl::optional<State> ReadState(bool is_machine);

  static std::string GetUpdaterName();
  static base::Version GetUpdaterVersion(bool is_machine);
  static bool IsAutoupdateCheckEnabled();
  static base::Time GetUpdaterLastStartedAU(bool is_machine);
  static base::Time GetUpdaterLastChecked(bool is_machine);
  static int GetUpdatePolicy();

  static std::string NormalizeTimeDelta(const base::TimeDelta& delta);

  // True if the updater is installed per-machine.
  bool is_machine_ = false;

  absl::optional<State> state_;
};

}  // namespace component_updater

#endif  // CHROME_BROWSER_COMPONENT_UPDATER_UPDATER_STATE_H_
