// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/time_zone.h"

#include <Windows.h>
#include <string>

#include "starboard/common/log.h"
#include "starboard/once.h"
#include "starboard/shared/win32/wchar_utils.h"

namespace {
class TimeZoneString {
 public:
  static TimeZoneString* Get();
  const char* value() const { return value_.c_str(); }

 private:
  // Returns a string representing a time zone name, e.g. "EST" for Eastern
  // Standard Time or "PDT" for Pacific Daylight Time. There isn't a native way
  // to convert these to IANA name format on Windows without UWP, so we're
  // making use of GetDynamicTimeZoneInformation for now.
  TimeZoneString() {
    DYNAMIC_TIME_ZONE_INFORMATION time_zone_info;
    DWORD zone_id = GetDynamicTimeZoneInformation(&time_zone_info);

    std::wstring wide_string;
    switch (zone_id) {
      case TIME_ZONE_ID_UNKNOWN:
      case TIME_ZONE_ID_STANDARD:
        wide_string = time_zone_info.StandardName;
        break;
      case TIME_ZONE_ID_DAYLIGHT:
        wide_string = time_zone_info.DaylightName;
        break;
      default:
        SB_NOTREACHED();
    }
    value_ = starboard::shared::win32::wchar_tToUTF8(wide_string.c_str());
  }
  std::string value_;
};

SB_ONCE_INITIALIZE_FUNCTION(TimeZoneString, TimeZoneString::Get);
}  // namespace.

const char* SbTimeZoneGetName() {
  const char* output = TimeZoneString::Get()->value();
  return output;
}
