#include "pch.h"
#include "System/TimeZoneInfo.h"
#include "System/Char.h"

#if defined(_WIN32)
#include <windows.h>
#include "Win32Internal.h"
using namespace DotNetDupe::System::Internal;
#endif

namespace DotNetDupe {
    namespace System {
        TimeZoneInfo::TimeZoneInfo(String id, TimeSpan baseUtcOffset, String displayName, String standardName, String daylightName, bool supportsDaylightSavingTime)
            : _id(id), _baseUtcOffset(baseUtcOffset), _displayName(displayName), _standardName(standardName), _daylightName(daylightName), _supportsDaylightSavingTime(supportsDaylightSavingTime) {
        }

        String TimeZoneInfo::GetId() const { return _id; }
        String TimeZoneInfo::GetDisplayName() const { return _displayName; }
        String TimeZoneInfo::GetStandardName() const { return _standardName; }
        String TimeZoneInfo::GetDaylightName() const { return _daylightName; }
        TimeSpan TimeZoneInfo::GetBaseUtcOffset() const { return _baseUtcOffset; }
        bool TimeZoneInfo::SupportsDaylightSavingTime() const { return _supportsDaylightSavingTime; }

        TimeZoneInfo TimeZoneInfo::Local() {
#if defined(_WIN32)
            DYNAMIC_TIME_ZONE_INFORMATION dtzi;
            DWORD result = GetDynamicTimeZoneInformation(&dtzi);
            
            String id = String(WCharToUtf8(dtzi.TimeZoneKeyName).c_str());
            TimeSpan baseUtcOffset(dtzi.Bias * -600000000LL);
            String displayName = String(WCharToUtf8(dtzi.StandardName).c_str()); 
            String standardName = String(WCharToUtf8(dtzi.StandardName).c_str());
            String daylightName = String(WCharToUtf8(dtzi.DaylightName).c_str());
            bool supportsDaylightSavingTime = (result != TIME_ZONE_ID_UNKNOWN);

            return TimeZoneInfo(id, baseUtcOffset, displayName, standardName, daylightName, supportsDaylightSavingTime);
#else
            return Utc(); // Placeholder for non-Windows
#endif
        }

        TimeZoneInfo TimeZoneInfo::Utc() {
            return TimeZoneInfo(String("UTC"), TimeSpan(0), String("(UTC) Coordinated Universal Time"), String("Coordinated Universal Time"), String("Coordinated Universal Time"), false);
        }

        TimeSpan TimeZoneInfo::GetUtcOffset(const DateTimeOffset& dateTimeOffset) const {
            if (_id == "UTC") return TimeSpan(0);
            return _baseUtcOffset; 
        }

        bool TimeZoneInfo::IsDaylightSavingTime(const DateTimeOffset& dateTimeOffset) const {
            if (!_supportsDaylightSavingTime) return false;
            return false;
        }

        DateTimeOffset TimeZoneInfo::ConvertTime(const DateTimeOffset& dateTimeOffset, const TimeZoneInfo& destinationTimeZone) {
            return dateTimeOffset; 
        }

        DateTimeOffset TimeZoneInfo::ConvertTime(const DateTimeOffset& dateTimeOffset, const TimeZoneInfo& sourceTimeZone, const TimeZoneInfo& destinationTimeZone) {
            return dateTimeOffset;
        }

        TimeZoneInfo TimeZoneInfo::FindSystemTimeZoneById(const String& id) {
            if (id == "UTC") return Utc();
            return Utc(); 
        }

        bool TimeZoneInfo::Equals(const TimeZoneInfo& other) const {
            return _id == other._id;
        }
    }
}

Generated by OpenCppCoverage (Version: 0.9.9.0)