// Copyright 2018 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

#ifndef FXJS_FX_DATE_HELPERS_H_
#define FXJS_FX_DATE_HELPERS_H_

#include <stddef.h>

#include "core/fxcrt/fx_string.h"

namespace fxjs {

enum class ConversionStatus { kSuccess = 0, kBadFormat, kBadDate };

extern const wchar_t* const kMonths[12];
extern const wchar_t* const kFullMonths[12];

double FX_GetDateTime();
int FX_GetYearFromTime(double dt);
int FX_GetMonthFromTime(double dt);
int FX_GetDayFromTime(double dt);
int FX_GetHourFromTime(double dt);
int FX_GetMinFromTime(double dt);
int FX_GetSecFromTime(double dt);
bool FX_IsValidMonth(int m);
bool FX_IsValidDay(int d);
bool FX_IsValid24Hour(int h);
bool FX_IsValidMinute(int m);
bool FX_IsValidSecond(int s);
double FX_LocalTime(double d);
double FX_MakeDay(int nYear, int nMonth, int nDay);
double FX_MakeTime(int nHour, int nMin, int nSec, int nMs);
double FX_MakeDate(double day, double time);

int FX_ParseStringInteger(const WideString& str,
                          size_t nStart,
                          size_t* pSkip,
                          size_t nMaxStep);

ConversionStatus FX_ParseDateUsingFormat(const WideString& value,
                                         const WideString& format,
                                         double* result);

}  // namespace fxjs

using fxjs::FX_GetDateTime;
using fxjs::FX_GetYearFromTime;
using fxjs::FX_GetMonthFromTime;
using fxjs::FX_GetDayFromTime;
using fxjs::FX_GetHourFromTime;
using fxjs::FX_GetMinFromTime;
using fxjs::FX_GetSecFromTime;
using fxjs::FX_IsValidMonth;
using fxjs::FX_IsValidDay;
using fxjs::FX_IsValid24Hour;
using fxjs::FX_IsValidMinute;
using fxjs::FX_IsValidSecond;
using fxjs::FX_LocalTime;
using fxjs::FX_MakeDay;
using fxjs::FX_MakeTime;
using fxjs::FX_MakeDate;
using fxjs::FX_ParseStringInteger;
using fxjs::FX_ParseDateUsingFormat;

#endif  // FXJS_FX_DATE_HELPERS_H_
