// Copyright 2017 The Fuchsia 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 GARNET_BIN_TIMEZONE_TIMEZONE_H_
#define GARNET_BIN_TIMEZONE_TIMEZONE_H_

#include <vector>

#include <fuchsia/timezone/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/sys/cpp/component_context.h>
#include "third_party/icu/source/common/unicode/strenum.h"

namespace time_zone {

// Implementation of the FIDL time service. Handles setting/getting the
// timezone offset by ICU timezone ID.  Also supports getting the raw UTC
// offset in minutes.
//
// For information on ICU ID's and timezone information see:
// http://userguide.icu-project.org/formatparse/datetime
class TimezoneImpl : public fuchsia::timezone::Timezone {
 public:
  // Constructs the time service with a caller-owned application context.
  TimezoneImpl(std::unique_ptr<sys::ComponentContext> context,
               const char icu_data_path[], const char tz_id_path[]);
  ~TimezoneImpl();

  // |Timezone|:
  void GetTimezoneOffsetMinutes(
      int64_t milliseconds, GetTimezoneOffsetMinutesCallback callback) override;
  void SetTimezone(std::string timezone_id,
                   SetTimezoneCallback callback) override;
  void GetTimezoneId(GetTimezoneIdCallback callback) override;
  void Watch(fidl::InterfaceHandle<fuchsia::timezone::TimezoneWatcher> watcher)
      override;

 private:
  bool Init();
  // Destroys a watcher proxy (called upon a connection error).
  void ReleaseWatcher(fuchsia::timezone::TimezoneWatcher* watcher);
  // Alerts all watchers when an update has occurred.
  void NotifyWatchers(const fidl::StringPtr& new_timezone_id);
  // Returns true if |timezone_id| is a valid timezone.
  bool IsValidTimezoneId(const fidl::StringPtr& timezone_id);
  // Private implementation of TimezoneImpl::GetTimezoneId, for use in other
  // methods. Returns a guaranteed-valid timezone ID.
  fidl::StringPtr GetTimezoneIdImpl();

  std::unique_ptr<sys::ComponentContext> context_;
  const char* const icu_data_path_;
  const char* const tz_id_path_;

  // Set to true iff |icu_data_| has been mapped, and the data contained therein
  // is the correct format (when Init() is successful).
  bool valid_;
  fidl::BindingSet<fuchsia::timezone::Timezone> bindings_;
  std::vector<fuchsia::timezone::TimezoneWatcherPtr> watchers_;
};

}  // namespace time_zone

#endif  // GARNET_BIN_TIMEZONE_TIMEZONE_H_
