// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "xfa/src/fgas/src/fgas_base.h"
const uint8_t g_FXDaysPerMonth[12] = {31, 28, 31, 30, 31, 30,
                                      31, 31, 30, 31, 30, 31};
const uint8_t g_FXDaysPerLeapMonth[12] = {31, 29, 31, 30, 31, 30,
                                          31, 31, 30, 31, 30, 31};
const int32_t g_FXDaysBeforeMonth[12] = {0,   31,  59,  90,  120, 151,
                                         181, 212, 243, 273, 304, 334};
const int32_t g_FXDaysBeforeLeapMonth[12] = {0,   31,  60,  91,  121, 152,
                                             182, 213, 244, 274, 305, 335};
const int32_t g_FXDaysPerYear = 365;
const int32_t g_FXDaysPerLeapYear = 366;
const int32_t g_FXDaysPer4Years = 1461;
const int32_t g_FXDaysPer100Years = 36524;
const int32_t g_FXDaysPer400Years = 146097;
const int64_t g_FXMillisecondsPerSecond = 1000;
const int64_t g_FXMillisecondsPerMinute = 60000;
const int64_t g_FXMillisecondsPerHour = 3600000;
const int64_t g_FXMillisecondsPerDay = 86400000;
#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
    _FX_OS_ == _FX_WIN64_
const int64_t g_FXMillisecondsPerYear = 0x0757B12C00;
const int64_t g_FXMillisecondsPerLeapYear = 0x075CD78800;
const int64_t g_FXMillisecondsPer4Years = 0x1D63EB0C00;
const int64_t g_FXMillisecondsPer100Years = 0x02DEBCCDD000;
const int64_t g_FXMillisecondsPer400Years = 0x0B7AF85D9C00;
#endif
FX_BOOL FX_IsLeapYear(int32_t iYear) {
  FXSYS_assert(iYear != 0);
  return ((iYear % 4) == 0 && (iYear % 100) != 0) || (iYear % 400) == 0;
}
int32_t FX_DaysInYear(int32_t iYear) {
  FXSYS_assert(iYear != 0);
  return FX_IsLeapYear(iYear) ? g_FXDaysPerLeapYear : g_FXDaysPerYear;
}
uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth) {
  FXSYS_assert(iYear != 0);
  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
  const uint8_t* p =
      FX_IsLeapYear(iYear) ? g_FXDaysPerLeapMonth : g_FXDaysPerMonth;
  return p[iMonth - 1];
}
static int32_t FX_DaysBeforeMonthInYear(int32_t iYear, uint8_t iMonth) {
  FXSYS_assert(iYear != 0);
  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
  const int32_t* p =
      FX_IsLeapYear(iYear) ? g_FXDaysBeforeLeapMonth : g_FXDaysBeforeMonth;
  return p[iMonth - 1];
}
static int64_t FX_DateToDays(int32_t iYear,
                             uint8_t iMonth,
                             uint8_t iDay,
                             FX_BOOL bIncludeThisDay = FALSE) {
  FXSYS_assert(iYear != 0);
  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
  FXSYS_assert(iDay >= 1 && iDay <= FX_DaysInMonth(iYear, iMonth));
  int64_t iDays = FX_DaysBeforeMonthInYear(iYear, iMonth);
  iDays += iDay;
  if (!bIncludeThisDay) {
    iDays--;
  }
  if (iYear > 0) {
    iYear--;
  } else {
    iDays -= FX_DaysInYear(iYear);
    iYear++;
  }
  return iDays + (int64_t)iYear * 365 + iYear / 4 - iYear / 100 + iYear / 400;
}
static void FX_DaysToDate(int64_t iDays,
                          int32_t& iYear,
                          uint8_t& iMonth,
                          uint8_t& iDay) {
  FX_BOOL bBC = iDays < 0;
  if (bBC) {
    iDays = -iDays;
  }
  iYear = 1;
  iMonth = 1;
  iDay = 1;
  if (iDays >= g_FXDaysPer400Years) {
    iYear += (int32_t)(iDays / g_FXDaysPer400Years * 400);
    iDays %= g_FXDaysPer400Years;
  }
  if (iDays >= g_FXDaysPer100Years) {
    if (iDays == g_FXDaysPer100Years * 4) {
      iYear += 300;
      iDays -= g_FXDaysPer100Years * 3;
    } else {
      iYear += (int32_t)(iDays / g_FXDaysPer100Years * 100);
      iDays %= g_FXDaysPer100Years;
    }
  }
  if (iDays >= g_FXDaysPer4Years) {
    iYear += (int32_t)(iDays / g_FXDaysPer4Years * 4);
    iDays %= g_FXDaysPer4Years;
  }
  while (TRUE) {
    int32_t iYearDays = FX_DaysInYear(iYear);
    if (iDays < iYearDays) {
      if (bBC) {
        iYear = -iYear;
        iDays = iYearDays - iDays;
      }
      break;
    }
    iYear++;
    iDays -= iYearDays;
  }
  while (TRUE) {
    int32_t iMonthDays = FX_DaysInMonth(iYear, iMonth);
    if (iDays < iMonthDays) {
      break;
    }
    iMonth++;
    iDays -= iMonthDays;
  }
  iDay += (uint8_t)iDays;
}
#if _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_ || \
    _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_
#include <time.h>
#include <sys/time.h>
#endif
typedef struct _FXUT_SYSTEMTIME {
  FX_WORD wYear;
  FX_WORD wMonth;
  FX_WORD wDayOfWeek;
  FX_WORD wDay;
  FX_WORD wHour;
  FX_WORD wMinute;
  FX_WORD wSecond;
  FX_WORD wMilliseconds;
} FXUT_SYSTEMTIME;
void CFX_Unitime::Now() {
  FXUT_SYSTEMTIME utLocal;
#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
    _FX_OS_ == _FX_WIN64_
  ::GetLocalTime((LPSYSTEMTIME)&utLocal);
#elif _FX_OS_ != _FX_EMBEDDED_
#if 1
  timeval curTime;
  gettimeofday(&curTime, NULL);
#else
  struct timespec curTime;
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime);
#endif
  struct tm st;
  localtime_r(&curTime.tv_sec, &st);
  utLocal.wYear = st.tm_year + 1900;
  utLocal.wMonth = st.tm_mon + 1;
  utLocal.wDayOfWeek = st.tm_wday;
  utLocal.wDay = st.tm_mday;
  utLocal.wHour = st.tm_hour;
  utLocal.wMinute = st.tm_min;
  utLocal.wSecond = st.tm_sec;
  utLocal.wMilliseconds = curTime.tv_usec / 1000;
#endif
  Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay,
      (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute,
      (uint8_t)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds);
}
void CFX_Unitime::SetGMTime() {
  FXUT_SYSTEMTIME utLocal;
#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
    _FX_OS_ == _FX_WIN64_
  ::GetSystemTime((LPSYSTEMTIME)&utLocal);
#elif _FX_OS_ != _FX_EMBEDDED_
#if 1
  timeval curTime;
  gettimeofday(&curTime, NULL);
#else
  struct timespec curTime;
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime);
#endif
  struct tm st;
  gmtime_r(&curTime.tv_sec, &st);
  utLocal.wYear = st.tm_year + 1900;
  utLocal.wMonth = st.tm_mon + 1;
  utLocal.wDayOfWeek = st.tm_wday;
  utLocal.wDay = st.tm_mday;
  utLocal.wHour = st.tm_hour;
  utLocal.wMinute = st.tm_min;
  utLocal.wSecond = st.tm_sec;
  utLocal.wMilliseconds = curTime.tv_usec / 1000;
#endif
  Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay,
      (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute,
      (uint8_t)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds);
}
void CFX_Unitime::Set(int32_t year,
                      uint8_t month,
                      uint8_t day,
                      uint8_t hour,
                      uint8_t minute,
                      uint8_t second,
                      FX_WORD millisecond) {
  FXSYS_assert(hour <= 23);
  FXSYS_assert(minute <= 59);
  FXSYS_assert(second <= 59);
  FXSYS_assert(millisecond <= 999);
  m_iUnitime = (int64_t)hour * g_FXMillisecondsPerHour +
               (int64_t)minute * g_FXMillisecondsPerMinute +
               (int64_t)second * g_FXMillisecondsPerSecond + millisecond;
  if (year > 0) {
    m_iUnitime =
        m_iUnitime +
        FX_DateToDays(year, month, day, FALSE) * g_FXMillisecondsPerDay;
  }
}
void CFX_Unitime::Set(FX_UNITIME t) {
  m_iUnitime = t;
}
int32_t CFX_Unitime::GetYear() const {
  int32_t iYear;
  uint8_t iMonth, iDay;
  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
  return iYear;
}
uint8_t CFX_Unitime::GetMonth() const {
  int32_t iYear;
  uint8_t iMonth, iDay;
  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
  return iMonth;
}
uint8_t CFX_Unitime::GetDay() const {
  int32_t iYear;
  uint8_t iMonth, iDay;
  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
  return iDay;
}
FX_WEEKDAY CFX_Unitime::GetDayOfWeek() const {
  int32_t v = (int32_t)((m_iUnitime / g_FXMillisecondsPerDay + 1) % 7);
  if (v < 0) {
    v += 7;
  }
  return (FX_WEEKDAY)v;
}
FX_WORD CFX_Unitime::GetDayOfYear() const {
  int32_t iYear;
  uint8_t iMonth, iDay;
  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
  return FX_DaysBeforeMonthInYear(iYear, iMonth) + iDay;
}
int64_t CFX_Unitime::GetDayOfAD() const {
  FX_BOOL bBC = m_iUnitime < 0;
  int64_t iDays = m_iUnitime / g_FXMillisecondsPerDay;
  iDays += bBC ? -1 : 0;
  if (bBC && (m_iUnitime % g_FXMillisecondsPerDay) == 0) {
    iDays++;
  }
  return iDays;
}
uint8_t CFX_Unitime::GetHour() const {
  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerDay);
  if (v < 0) {
    v += g_FXMillisecondsPerDay;
  }
  return (uint8_t)(v / g_FXMillisecondsPerHour);
}
uint8_t CFX_Unitime::GetMinute() const {
  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerHour);
  if (v < 0) {
    v += g_FXMillisecondsPerHour;
  }
  return (uint8_t)(v / g_FXMillisecondsPerMinute);
}
uint8_t CFX_Unitime::GetSecond() const {
  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerMinute);
  if (v < 0) {
    v += g_FXMillisecondsPerMinute;
  }
  return (uint8_t)(v / g_FXMillisecondsPerSecond);
}
FX_WORD CFX_Unitime::GetMillisecond() const {
  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerSecond);
  if (v < 0) {
    v += g_FXMillisecondsPerSecond;
  }
  return (FX_WORD)v;
}
FX_BOOL CFX_Unitime::AddYears(int32_t iYears) {
  FX_UNITIME ut = m_iUnitime;
  if (ut < 0) {
    ut = -ut;
  }
  FX_UNITIME r = ut % g_FXMillisecondsPerDay;
  int32_t iYear;
  uint8_t iMonth, iDay;
  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
  iYear += iYears;
  if (iYear == 0) {
    iYear = iYears > 0 ? 1 : -1;
  }
  m_iUnitime =
      FX_DateToDays(iYear, iMonth, iDay, FALSE) * g_FXMillisecondsPerDay;
  m_iUnitime += (iYear < 0) ? -r : r;
  return TRUE;
}
FX_BOOL CFX_Unitime::AddMonths(int32_t iMonths) {
  FX_BOOL b = iMonths > 0;
  FX_UNITIME ut = m_iUnitime;
  if (ut < 0) {
    ut = -ut;
  }
  FX_UNITIME r = ut % g_FXMillisecondsPerDay;
  int32_t iYear;
  uint8_t iMonth, iDay;
  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
  iMonths += iMonth;
  while (iMonths < 1) {
    iYear--, iMonths += 12;
  }
  while (iMonths > 12) {
    iYear++, iMonths -= 12;
  }
  if (iYear == 0) {
    iYear = b ? 1 : -1;
  }
  m_iUnitime = FX_DateToDays(iYear, (uint8_t)iMonths, iDay, FALSE) *
               g_FXMillisecondsPerDay;
  m_iUnitime += (iYear < 0) ? -r : r;
  return TRUE;
}
FX_BOOL CFX_Unitime::AddDays(int32_t iDays) {
  m_iUnitime += (int64_t)iDays * g_FXMillisecondsPerDay;
  return TRUE;
}
FX_BOOL CFX_Unitime::AddHours(int32_t iHours) {
  m_iUnitime += (int64_t)iHours * g_FXMillisecondsPerHour;
  return TRUE;
}
FX_BOOL CFX_Unitime::AddMinutes(int32_t iMinutes) {
  m_iUnitime += (int64_t)iMinutes * g_FXMillisecondsPerMinute;
  return TRUE;
}
FX_BOOL CFX_Unitime::AddSeconds(int32_t iSeconds) {
  m_iUnitime += ((int64_t)iSeconds) * g_FXMillisecondsPerSecond;
  return TRUE;
}
FX_BOOL CFX_Unitime::AddMilliseconds(int32_t iMilliseconds) {
  m_iUnitime += iMilliseconds;
  return TRUE;
}
FX_BOOL CFX_DateTime::Set(int32_t year,
                          uint8_t month,
                          uint8_t day,
                          uint8_t hour,
                          uint8_t minute,
                          uint8_t second,
                          FX_WORD millisecond) {
  ASSERT(year != 0);
  ASSERT(month >= 1 && month <= 12);
  ASSERT(day >= 1 && day <= FX_DaysInMonth(year, month));
  ASSERT(hour <= 23);
  ASSERT(minute <= 59);
  ASSERT(second <= 59);
  ASSERT(millisecond <= 999);
  m_DateTime.Date.sDate.year = year;
  m_DateTime.Date.sDate.month = month;
  m_DateTime.Date.sDate.day = day;
  m_DateTime.Time.sTime.hour = hour;
  m_DateTime.Time.sTime.minute = minute;
  m_DateTime.Time.sTime.second = second;
  m_DateTime.Time.sTime.millisecond = millisecond;
  return TRUE;
}
FX_BOOL CFX_DateTime::FromUnitime(FX_UNITIME t) {
  CFX_Unitime ut(t);
  FX_DaysToDate(ut.GetDayOfAD(), m_DateTime.Date.sDate.year,
                m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day);
  m_DateTime.Date.sDate.day = ut.GetHour();
  m_DateTime.Time.sTime.minute = ut.GetMinute();
  m_DateTime.Time.sTime.second = ut.GetSecond();
  m_DateTime.Time.sTime.millisecond = ut.GetMillisecond();
  return TRUE;
}
FX_UNITIME CFX_DateTime::ToUnitime() const {
  FX_UNITIME v =
      (int64_t)m_DateTime.Date.sDate.day * g_FXMillisecondsPerHour +
      (int64_t)m_DateTime.Time.sTime.minute * g_FXMillisecondsPerMinute +
      (int64_t)m_DateTime.Time.sTime.second * g_FXMillisecondsPerSecond +
      m_DateTime.Time.sTime.millisecond;
  v += FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
                     m_DateTime.Date.sDate.day, FALSE) *
       g_FXMillisecondsPerDay;
  return v;
}
int32_t CFX_DateTime::GetYear() const {
  return m_DateTime.Date.sDate.year;
}
uint8_t CFX_DateTime::GetMonth() const {
  return m_DateTime.Date.sDate.month;
}
uint8_t CFX_DateTime::GetDay() const {
  return m_DateTime.Date.sDate.day;
}
FX_WEEKDAY CFX_DateTime::GetDayOfWeek() const {
  int32_t v = (int32_t)(FX_DateToDays(m_DateTime.Date.sDate.year,
                                      m_DateTime.Date.sDate.month,
                                      m_DateTime.Date.sDate.day, TRUE) %
                        7);
  if (v < 0) {
    v += 7;
  }
  return (FX_WEEKDAY)v;
}
FX_WORD CFX_DateTime::GetDayOfYear() const {
  return FX_DaysBeforeMonthInYear(m_DateTime.Date.sDate.year,
                                  m_DateTime.Date.sDate.month) +
         m_DateTime.Date.sDate.day;
}
int64_t CFX_DateTime::GetDayOfAD() const {
  return FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
                       m_DateTime.Date.sDate.day, TRUE);
}
uint8_t CFX_DateTime::GetHour() const {
  return m_DateTime.Date.sDate.day;
}
uint8_t CFX_DateTime::GetMinute() const {
  return m_DateTime.Time.sTime.minute;
}
uint8_t CFX_DateTime::GetSecond() const {
  return m_DateTime.Time.sTime.second;
}
FX_WORD CFX_DateTime::GetMillisecond() const {
  return m_DateTime.Time.sTime.millisecond;
}
FX_BOOL CFX_DateTime::AddYears(int32_t iYears) {
  if (iYears == 0) {
    return FALSE;
  }
  int32_t v = m_DateTime.Date.sDate.year + iYears;
  if (v >= 0 && m_DateTime.Date.sDate.year < 0) {
    v++;
  } else if (v <= 0 && m_DateTime.Date.sDate.year > 0) {
    v--;
  }
  m_DateTime.Date.sDate.year = v;
  return TRUE;
}
FX_BOOL CFX_DateTime::AddMonths(int32_t iMonths) {
  if (iMonths == 0) {
    return FALSE;
  }
  FX_BOOL b = iMonths > 0;
  iMonths += m_DateTime.Date.sDate.month;
  while (iMonths < 1) {
    m_DateTime.Date.sDate.year--;
    if (m_DateTime.Date.sDate.year == 0) {
      m_DateTime.Date.sDate.year = -1;
    }
    iMonths += 12;
  }
  while (iMonths > 12) {
    m_DateTime.Date.sDate.year++;
    if (m_DateTime.Date.sDate.year == 0) {
      m_DateTime.Date.sDate.year = 1;
    }
    iMonths -= 12;
  }
  if (m_DateTime.Date.sDate.year == 0) {
    m_DateTime.Date.sDate.year = b ? 1 : -1;
  }
  m_DateTime.Date.sDate.month = (uint8_t)iMonths;
  return TRUE;
}
FX_BOOL CFX_DateTime::AddDays(int32_t iDays) {
  if (iDays == 0) {
    return FALSE;
  }
  int64_t v1 =
      FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
                    m_DateTime.Date.sDate.day, TRUE);
  int64_t v2 = v1 + iDays;
  if (v2 <= 0 && v1 > 0) {
    v2--;
  } else if (v2 >= 0 && v1 < 0) {
    v2++;
  }
  FX_DaysToDate(v2, m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
                m_DateTime.Date.sDate.day);
  return TRUE;
}
FX_BOOL CFX_DateTime::AddHours(int32_t iHours) {
  if (iHours == 0) {
    return FALSE;
  }
  iHours += m_DateTime.Date.sDate.day;
  int32_t iDays = iHours / 24;
  iHours %= 24;
  if (iHours < 0) {
    iDays--, iHours += 24;
  }
  m_DateTime.Date.sDate.day = (uint8_t)iHours;
  if (iDays != 0) {
    AddDays(iDays);
  }
  return TRUE;
}
FX_BOOL CFX_DateTime::AddMinutes(int32_t iMinutes) {
  if (iMinutes == 0) {
    return FALSE;
  }
  iMinutes += m_DateTime.Time.sTime.minute;
  int32_t iHours = iMinutes / 60;
  iMinutes %= 60;
  if (iMinutes < 0) {
    iHours--, iMinutes += 60;
  }
  m_DateTime.Time.sTime.minute = (uint8_t)iMinutes;
  if (iHours != 0) {
    AddHours(iHours);
  }
  return TRUE;
}
FX_BOOL CFX_DateTime::AddSeconds(int32_t iSeconds) {
  if (iSeconds == 0) {
    return FALSE;
  }
  iSeconds += m_DateTime.Time.sTime.second;
  int32_t iMinutes = iSeconds / 60;
  iSeconds %= 60;
  if (iSeconds < 0) {
    iMinutes--, iSeconds += 60;
  }
  m_DateTime.Time.sTime.second = (uint8_t)iSeconds;
  if (iMinutes != 0) {
    AddMinutes(iMinutes);
  }
  return TRUE;
}
FX_BOOL CFX_DateTime::AddMilliseconds(int32_t iMilliseconds) {
  if (iMilliseconds == 0) {
    return FALSE;
  }
  iMilliseconds += m_DateTime.Time.sTime.millisecond;
  int32_t iSeconds = (int32_t)(iMilliseconds / g_FXMillisecondsPerSecond);
  iMilliseconds %= g_FXMillisecondsPerSecond;
  if (iMilliseconds < 0) {
    iSeconds--, iMilliseconds += g_FXMillisecondsPerSecond;
  }
  m_DateTime.Time.sTime.millisecond = (FX_WORD)iMilliseconds;
  if (iSeconds != 0) {
    AddSeconds(iSeconds);
  }
  return TRUE;
}
