// 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_FM2JS_XFA_SIMPLEEXPRESSION_H_
#define XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_

#include <memory>

#include "core/fxcrt/fx_basic.h"
#include "xfa/fxfa/fm2js/xfa_lexer.h"

#define RUNTIMEFUNCTIONRETURNVALUE \
  (FX_WSTRC(L"foxit_xfa_formcalc_runtime_func_return_value"))
#define EXCLAMATION_IN_IDENTIFIER \
  (FX_WSTRC(L"foxit_xfa_formcalc__exclamation__"))

enum XFA_FM_SimpleExpressionType {
  ASSIGN,
  LOGICALOR,
  LOGICALAND,
  EQUALITY,
  NOTEQUALITY,
  LESS,
  LESSEQUAL,
  GREATER,
  GREATEREQUAL,
  PLUS,
  MINUS,
  MULTIPLE,
  DIVIDE,
  POSITIVE,
  NEGATIVE,
  NOT,
  CALL,
  DOT,
  DOTDOT,
  CONCATFMOBJECT,
  ISFMOBJECT,
  ISFMARRAY,
  GETFMVALUE,
  GETFMJSOBJ,
  VARFILTER
};

CFX_WideStringC XFA_FM_EXPTypeToString(
    XFA_FM_SimpleExpressionType simpleExpType);

enum XFA_FM_AccessorIndex {
  ACCESSOR_NO_INDEX,
  ACCESSOR_NO_RELATIVEINDEX,
  ACCESSOR_POSITIVE_INDEX,
  ACCESSOR_NEGATIVE_INDEX
};

class CXFA_FMSimpleExpression {
 public:
  CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op);
  virtual ~CXFA_FMSimpleExpression() {}
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);

  XFA_FM_TOKEN GetOperatorToken() const;

 protected:
  uint32_t m_line;
  XFA_FM_TOKEN m_op;
};

class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
 public:
  explicit CXFA_FMNullExpression(uint32_t line);
  ~CXFA_FMNullExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMNumberExpression(uint32_t line, CFX_WideStringC wsNumber);
  ~CXFA_FMNumberExpression() override;
  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  CFX_WideStringC m_wsNumber;
};

class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMStringExpression(uint32_t line, CFX_WideStringC wsString);
  ~CXFA_FMStringExpression() override;
  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  CFX_WideStringC m_wsString;
};

class CXFA_FMIdentifierExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMIdentifierExpression(uint32_t line, CFX_WideStringC wsIdentifier);
  ~CXFA_FMIdentifierExpression() override;
  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  CFX_WideStringC m_wsIdentifier;
};

class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMUnaryExpression(uint32_t line,
                         XFA_FM_TOKEN op,
                         CXFA_FMSimpleExpression* pExp);
  ~CXFA_FMUnaryExpression() override;

  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 protected:
  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
};

class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMBinExpression(uint32_t line,
                       XFA_FM_TOKEN op,
                       CXFA_FMSimpleExpression* pExp1,
                       CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMBinExpression() override;

  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 protected:
  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
};

class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMAssignExpression(uint32_t line,
                          XFA_FM_TOKEN op,
                          CXFA_FMSimpleExpression* pExp1,
                          CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMAssignExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
  void ToImpliedReturnJS(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMLogicalOrExpression(uint32_t line,
                             XFA_FM_TOKEN op,
                             CXFA_FMSimpleExpression* pExp1,
                             CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMLogicalOrExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMLogicalAndExpression(uint32_t line,
                              XFA_FM_TOKEN op,
                              CXFA_FMSimpleExpression* pExp1,
                              CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMLogicalAndExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMEqualityExpression(uint32_t line,
                            XFA_FM_TOKEN op,
                            CXFA_FMSimpleExpression* pExp1,
                            CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMEqualityExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMRelationalExpression(uint32_t line,
                              XFA_FM_TOKEN op,
                              CXFA_FMSimpleExpression* pExp1,
                              CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMRelationalExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMAdditiveExpression(uint32_t line,
                            XFA_FM_TOKEN op,
                            CXFA_FMSimpleExpression* pExp1,
                            CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMAdditiveExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMMultiplicativeExpression(uint32_t line,
                                  XFA_FM_TOKEN op,
                                  CXFA_FMSimpleExpression* pExp1,
                                  CXFA_FMSimpleExpression* pExp2);
  ~CXFA_FMMultiplicativeExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMPosExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
  ~CXFA_FMPosExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMNegExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
  ~CXFA_FMNegExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMNotExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
  ~CXFA_FMNotExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMCallExpression(uint32_t line,
                        CXFA_FMSimpleExpression* pExp,
                        CFX_ArrayTemplate<CXFA_FMSimpleExpression*>* pArguments,
                        FX_BOOL bIsSomMethod);
  ~CXFA_FMCallExpression() override;

  bool IsBuildInFunc(CFX_WideTextBuf* funcName);
  uint32_t IsMethodWithObjParam(const CFX_WideStringC& methodName);
  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  FX_BOOL m_bIsSomMethod;
  CFX_ArrayTemplate<CXFA_FMSimpleExpression*>* m_pArguments;
};

class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMDotAccessorExpression(uint32_t line,
                               CXFA_FMSimpleExpression* pAccessor,
                               XFA_FM_TOKEN op,
                               CFX_WideStringC wsIdentifier,
                               CXFA_FMSimpleExpression* pIndexExp);
  ~CXFA_FMDotAccessorExpression() override;
  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  CFX_WideStringC m_wsIdentifier;
};

class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMIndexExpression(uint32_t line,
                         XFA_FM_AccessorIndex accessorIndex,
                         CXFA_FMSimpleExpression* pIndexExp,
                         FX_BOOL bIsStarIndex);
  ~CXFA_FMIndexExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  XFA_FM_AccessorIndex m_accessorIndex;
  FX_BOOL m_bIsStarIndex;
};

class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMDotDotAccessorExpression(uint32_t line,
                                  CXFA_FMSimpleExpression* pAccessor,
                                  XFA_FM_TOKEN op,
                                  CFX_WideStringC wsIdentifier,
                                  CXFA_FMSimpleExpression* pIndexExp);
  ~CXFA_FMDotDotAccessorExpression() override;

  void ToJavaScript(CFX_WideTextBuf& javascript) override;

 private:
  CFX_WideStringC m_wsIdentifier;
};

class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMMethodCallExpression(uint32_t line,
                              CXFA_FMSimpleExpression* pAccessorExp1,
                              CXFA_FMSimpleExpression* pCallExp);
  ~CXFA_FMMethodCallExpression() override {}
  void ToJavaScript(CFX_WideTextBuf& javascript) override;
};

#endif  // XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
