// Copyright 2016 The PDFium Authors
// 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 "core/fpdfdoc/cpdf_aaction.h"

#include <iterator>
#include <utility>

#include "core/fpdfapi/parser/cpdf_dictionary.h"

namespace {

constexpr const char* kAATypes[] = {
    "E",   // kCursorEnter
    "X",   // kCursorExit
    "D",   // kButtonDown
    "U",   // kButtonUp
    "Fo",  // kGetFocus
    "Bl",  // kLoseFocus
    "PO",  // kPageOpen
    "PC",  // kPageClose
    "PV",  // kPageVisible
    "PI",  // kPageInvisible
    "O",   // kOpenPage
    "C",   // kClosePage
    "K",   // kKeyStroke
    "F",   // kFormat
    "V",   // kValidate
    "C",   // kCalculate
    "WC",  // kCloseDocument
    "WS",  // kSaveDocument
    "DS",  // kDocumentSaved
    "WP",  // kPrintDocument
    "DP",  // kDocumentPrinted
};

// |kAATypes| should have one less element than enum AActionType due to
// |kDocumentOpen|, which is an artificial type.
static_assert(std::size(kAATypes) == CPDF_AAction::kNumberOfActions - 1,
              "kAATypes count mismatch");

}  // namespace

CPDF_AAction::CPDF_AAction(RetainPtr<const CPDF_Dictionary> pDict)
    : m_pDict(std::move(pDict)) {}

CPDF_AAction::CPDF_AAction(const CPDF_AAction& that) = default;

CPDF_AAction::~CPDF_AAction() = default;

bool CPDF_AAction::ActionExist(AActionType eType) const {
  return m_pDict && m_pDict->KeyExist(kAATypes[eType]);
}

CPDF_Action CPDF_AAction::GetAction(AActionType eType) const {
  return CPDF_Action(m_pDict ? m_pDict->GetDictFor(kAATypes[eType]) : nullptr);
}

// static
bool CPDF_AAction::IsUserInput(AActionType type) {
  switch (type) {
    case kButtonUp:
    case kButtonDown:
    case kKeyStroke:
      return true;
    default:
      return false;
  }
}
