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

#ifndef XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
#define XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_

#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
#include "xfa/fxfa/parser/cxfa_widgetdata.h"

class IFX_Locale;
class CFX_Unitime;
class CXFA_LocaleMgr;

#define XFA_VT_NULL 0
#define XFA_VT_BOOLEAN 1
#define XFA_VT_INTEGER 2
#define XFA_VT_DECIMAL 4
#define XFA_VT_FLOAT 8
#define XFA_VT_TEXT 16
#define XFA_VT_DATE 32
#define XFA_VT_TIME 64
#define XFA_VT_DATETIME 128

class CXFA_LocaleValue {
 public:
  CXFA_LocaleValue();
  CXFA_LocaleValue(const CXFA_LocaleValue& value);
  CXFA_LocaleValue(uint32_t dwType, CXFA_LocaleMgr* pLocaleMgr);
  CXFA_LocaleValue(uint32_t dwType,
                   const CFX_WideString& wsValue,
                   CXFA_LocaleMgr* pLocaleMgr);
  CXFA_LocaleValue(uint32_t dwType,
                   const CFX_WideString& wsValue,
                   const CFX_WideString& wsFormat,
                   IFX_Locale* pLocale,
                   CXFA_LocaleMgr* pLocaleMgr);
  ~CXFA_LocaleValue();
  CXFA_LocaleValue& operator=(const CXFA_LocaleValue& value);

  FX_BOOL ValidateValue(const CFX_WideString& wsValue,
                        const CFX_WideString& wsPattern,
                        IFX_Locale* pLocale,
                        CFX_WideString* pMatchFormat = nullptr);
  FX_BOOL FormatPatterns(CFX_WideString& wsResult,
                         const CFX_WideString& wsFormat,
                         IFX_Locale* pLocale,
                         XFA_VALUEPICTURE eValueType) const;
  FX_BOOL FormatSinglePattern(CFX_WideString& wsResult,
                              const CFX_WideString& wsFormat,
                              IFX_Locale* pLocale,
                              XFA_VALUEPICTURE eValueType) const;
  FX_BOOL ValidateCanonicalValue(const CFX_WideString& wsValue,
                                 uint32_t dwVType);
  FX_BOOL ValidateCanonicalDate(const CFX_WideString& wsDate,
                                CFX_Unitime& unDate);
  FX_BOOL ValidateCanonicalTime(const CFX_WideString& wsTime);
  FX_BOOL ValidateCanonicalDateTime(const CFX_WideString& wsDateTime);
  void GetNumbericFormat(CFX_WideString& wsFormat,
                         int32_t nIntLen,
                         int32_t nDecLen,
                         FX_BOOL bSign = TRUE);
  FX_BOOL ValidateNumericTemp(CFX_WideString& wsNumeric,
                              CFX_WideString& wsFormat,
                              IFX_Locale* pLocale = nullptr,
                              int32_t* pos = nullptr);

  CFX_WideString GetValue() const;
  uint32_t GetType() const;
  void SetValue(const CFX_WideString& wsValue, uint32_t dwType);
  CFX_WideString GetText() const;
  FX_FLOAT GetNum() const;
  FX_DOUBLE GetDoubleNum() const;
  CFX_Unitime GetDate() const;
  CFX_Unitime GetTime() const;
  CFX_Unitime GetDateTime() const;
  FX_BOOL SetText(const CFX_WideString& wsText);
  FX_BOOL SetText(const CFX_WideString& wsText,
                  const CFX_WideString& wsFormat,
                  IFX_Locale* pLocale);
  FX_BOOL SetNum(FX_FLOAT fNum);
  FX_BOOL SetNum(const CFX_WideString& wsNum,
                 const CFX_WideString& wsFormat,
                 IFX_Locale* pLocale);
  FX_BOOL SetDate(const CFX_Unitime& d);
  FX_BOOL SetDate(const CFX_WideString& wsDate,
                  const CFX_WideString& wsFormat,
                  IFX_Locale* pLocale);
  FX_BOOL SetTime(const CFX_Unitime& t);
  FX_BOOL SetTime(const CFX_WideString& wsTime,
                  const CFX_WideString& wsFormat,
                  IFX_Locale* pLocale);
  FX_BOOL SetDateTime(const CFX_Unitime& dt);
  FX_BOOL SetDateTime(const CFX_WideString& wsDateTime,
                      const CFX_WideString& wsFormat,
                      IFX_Locale* pLocale);
  bool IsNull() const { return m_dwType == XFA_VT_NULL; }
  FX_BOOL IsEmpty() const { return m_wsValue.IsEmpty(); }
  FX_BOOL IsValid() const { return m_bValid; }

 protected:
  FX_BOOL ParsePatternValue(const CFX_WideString& wsValue,
                            const CFX_WideString& wsPattern,
                            IFX_Locale* pLocale);
  CXFA_LocaleMgr* m_pLocaleMgr;
  CFX_WideString m_wsValue;
  uint32_t m_dwType;
  FX_BOOL m_bValid;
};

#endif  // XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
