// Copyright 2017 The Chromium OS 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 SRC_MANIFEST_H_
#define SRC_MANIFEST_H_

#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/values.h>
#include <string>

namespace huddly {

class Manifest {
 public:
  explicit Manifest(const base::FilePath& path) : path_(path) {}
  Manifest() = default;
  ~Manifest() = default;

  bool ParseFile();
  int ParseManifestVersion(const base::Value& dic);
  bool IsCompatible(int manifest_ver);
  void ParseHardwareRev(const base::Value& dic, std::string* hw_rev);
  void ParseFirmwareFileVersions(const base::Value& dic,
                                 std::string* app_ver,
                                 std::string* boot_ver);

  std::string GetFileContent(const base::FilePath& path);
  std::string ListToStr(const base::Value& list_val,
                        const std::string& separator);
  void Dump();  // show the result of parsing.

  void set_path(const base::FilePath& path) { path_ = path; }
  base::FilePath path() const { return path_; }
  std::string app_ver() const { return app_ver_; }
  std::string boot_ver() const { return boot_ver_; }
  std::string hw_rev() const { return hw_rev_; }

 private:
  base::FilePath path_;

  int manifest_ver_;
  std::string app_ver_;
  std::string boot_ver_;
  std::string hw_rev_;

  DISALLOW_COPY_AND_ASSIGN(Manifest);
};

}  // namespace huddly

#endif  // SRC_MANIFEST_H_
