// Copyright 2017 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 CORE_FXCRT_CSS_CFX_CSSSTYLESELECTOR_H_
#define CORE_FXCRT_CSS_CFX_CSSSTYLESELECTOR_H_

#include <stdint.h>

#include <memory>
#include <vector>

#include "core/fxcrt/css/cfx_css.h"
#include "core/fxcrt/css/cfx_cssrulecollection.h"
#include "core/fxcrt/css/cfx_cssvalue.h"
#include "core/fxcrt/retain_ptr.h"

class CFX_CSSComputedStyle;
class CFX_CSSCustomProperty;
class CFX_CSSDeclaration;
class CFX_CSSPropertyHolder;
class CFX_CSSSelector;
class CFX_CSSStyleSheet;
class CFX_CSSValueList;

class CFX_CSSStyleSelector {
 public:
  CFX_CSSStyleSelector();
  ~CFX_CSSStyleSelector();

  void SetDefaultFontSize(float fFontSize);
  void SetUAStyleSheet(std::unique_ptr<CFX_CSSStyleSheet> pSheet);
  void UpdateStyleIndex();

  RetainPtr<CFX_CSSComputedStyle> CreateComputedStyle(
      const CFX_CSSComputedStyle* pParentStyle);

  // Note, the dest style has to be an out param because the CXFA_TextParser
  // adds non-inherited data from the parent style. Attempting to copy
  // internally will fail as you'll lose the non-inherited data.
  void ComputeStyle(const std::vector<const CFX_CSSDeclaration*>& declArray,
                    const WideString& styleString,
                    const WideString& alignString,
                    CFX_CSSComputedStyle* pDestStyle);

  std::vector<const CFX_CSSDeclaration*> MatchDeclarations(
      const WideString& tagname);

 private:
  bool MatchSelector(const WideString& tagname, CFX_CSSSelector* pSel);

  void AppendInlineStyle(CFX_CSSDeclaration* pDecl, const WideString& style);
  void ApplyDeclarations(
      const std::vector<const CFX_CSSDeclaration*>& declArray,
      const CFX_CSSDeclaration* extraDecl,
      CFX_CSSComputedStyle* pDestStyle);
  void ApplyProperty(CFX_CSSProperty eProperty,
                     const RetainPtr<CFX_CSSValue>& pValue,
                     CFX_CSSComputedStyle* pComputedStyle);
  void ExtractValues(const CFX_CSSDeclaration* decl,
                     std::vector<const CFX_CSSPropertyHolder*>* importants,
                     std::vector<const CFX_CSSPropertyHolder*>* normals,
                     std::vector<const CFX_CSSCustomProperty*>* custom);

  bool SetLengthWithPercent(CFX_CSSLength& width,
                            CFX_CSSValue::PrimitiveType eType,
                            const RetainPtr<CFX_CSSValue>& pValue,
                            float fFontSize);
  float ToFontSize(CFX_CSSPropertyValue eValue, float fCurFontSize);
  CFX_CSSDisplay ToDisplay(CFX_CSSPropertyValue eValue);
  CFX_CSSTextAlign ToTextAlign(CFX_CSSPropertyValue eValue);
  uint16_t ToFontWeight(CFX_CSSPropertyValue eValue);
  CFX_CSSFontStyle ToFontStyle(CFX_CSSPropertyValue eValue);
  CFX_CSSVerticalAlign ToVerticalAlign(CFX_CSSPropertyValue eValue);
  uint32_t ToTextDecoration(const RetainPtr<CFX_CSSValueList>& pList);
  CFX_CSSFontVariant ToFontVariant(CFX_CSSPropertyValue eValue);

  float m_fDefaultFontSize = 12.0f;
  std::unique_ptr<CFX_CSSStyleSheet> m_UAStyles;
  CFX_CSSRuleCollection m_UARules;
};

#endif  // CORE_FXCRT_CSS_CFX_CSSSTYLESELECTOR_H_
