// Copyright 2016 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/fxfa/parser/cxfa_validatedata.h"

#include "xfa/fxfa/parser/cxfa_node.h"
#include "xfa/fxfa/parser/xfa_utils.h"

namespace {

constexpr wchar_t kFormatTest[] = L"formatTest";
constexpr wchar_t kNullTest[] = L"nullTest";
constexpr wchar_t kScriptTest[] = L"scriptTest";

}  // namespace

CXFA_ValidateData::CXFA_ValidateData(CXFA_Node* pNode) : CXFA_DataData(pNode) {}

XFA_AttributeEnum CXFA_ValidateData::GetFormatTest() const {
  return m_pNode->JSObject()->GetEnum(XFA_Attribute::FormatTest);
}

void CXFA_ValidateData::SetNullTest(const WideString& wsValue) {
  pdfium::Optional<XFA_AttributeEnum> item =
      CXFA_Node::NameToAttributeEnum(wsValue.AsStringView());
  m_pNode->JSObject()->SetEnum(XFA_Attribute::NullTest,
                               item ? *item : XFA_AttributeEnum::Disabled,
                               false);
}

XFA_AttributeEnum CXFA_ValidateData::GetNullTest() const {
  return m_pNode->JSObject()->GetEnum(XFA_Attribute::NullTest);
}

XFA_AttributeEnum CXFA_ValidateData::GetScriptTest() const {
  return m_pNode->JSObject()->GetEnum(XFA_Attribute::ScriptTest);
}

WideString CXFA_ValidateData::GetMessageText(
    const WideString& wsMessageType) const {
  CXFA_Node* pNode =
      m_pNode->JSObject()->GetProperty(0, XFA_Element::Message, false);
  if (!pNode)
    return L"";

  for (CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
       pItemNode;
       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
    if (pItemNode->GetElementType() != XFA_Element::Text)
      continue;

    WideString wsName = pItemNode->JSObject()->GetCData(XFA_Attribute::Name);
    if (wsName.IsEmpty() || wsName == wsMessageType)
      return pItemNode->JSObject()->GetContent(false);
  }
  return L"";
}

void CXFA_ValidateData::SetFormatMessageText(const WideString& wsMessage) {
  SetMessageText(kFormatTest, wsMessage);
}

WideString CXFA_ValidateData::GetFormatMessageText() const {
  return GetMessageText(kFormatTest);
}

void CXFA_ValidateData::SetNullMessageText(const WideString& wsMessage) {
  SetMessageText(kNullTest, wsMessage);
}

WideString CXFA_ValidateData::GetNullMessageText() const {
  return GetMessageText(kNullTest);
}

WideString CXFA_ValidateData::GetScriptMessageText() const {
  return GetMessageText(kScriptTest);
}

void CXFA_ValidateData::SetScriptMessageText(const WideString& wsMessage) {
  SetMessageText(kScriptTest, wsMessage);
}

void CXFA_ValidateData::SetMessageText(const WideString& wsMessageType,
                                       const WideString& wsMessage) {
  CXFA_Node* pNode =
      m_pNode->JSObject()->GetProperty(0, XFA_Element::Message, true);
  if (!pNode)
    return;

  for (CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
       pItemNode;
       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
    if (pItemNode->GetElementType() != XFA_Element::Text)
      continue;

    WideString wsName = pItemNode->JSObject()->GetCData(XFA_Attribute::Name);
    if (wsName.IsEmpty() || wsName == wsMessageType) {
      pItemNode->JSObject()->SetContent(wsMessage, wsMessage, false, false,
                                        true);
      return;
    }
  }

  CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_Element::Text);
  pNode->InsertChild(pTextNode, nullptr);
  pTextNode->JSObject()->SetCData(XFA_Attribute::Name, wsMessageType, false,
                                  false);
  pTextNode->JSObject()->SetContent(wsMessage, wsMessage, false, false, true);
}

WideString CXFA_ValidateData::GetPicture() const {
  CXFA_Node* pNode = m_pNode->GetChild(0, XFA_Element::Picture, false);
  if (pNode)
    return pNode->JSObject()->GetContent(false);
  return L"";
}

CXFA_ScriptData CXFA_ValidateData::GetScriptData() const {
  return CXFA_ScriptData(m_pNode->GetChild(0, XFA_Element::Script, false));
}
