// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NGConstraintSpace_h
#define NGConstraintSpace_h

#include "core/CoreExport.h"
#include "core/layout/ng/geometry/ng_logical_offset.h"
#include "core/layout/ng/geometry/ng_logical_size.h"
#include "core/layout/ng/geometry/ng_margin_strut.h"
#include "core/layout/ng/geometry/ng_physical_size.h"
#include "core/layout/ng/ng_exclusion.h"
#include "core/layout/ng/ng_layout_opportunity_iterator.h"
#include "core/layout/ng/ng_unpositioned_float.h"
#include "core/layout/ng/ng_writing_mode.h"
#include "platform/heap/Handle.h"
#include "platform/text/TextDirection.h"
#include "platform/wtf/Optional.h"
#include "platform/wtf/RefCounted.h"
#include "platform/wtf/text/WTFString.h"

namespace blink {

class LayoutBox;

enum NGFragmentationType {
  kFragmentNone,
  kFragmentPage,
  kFragmentColumn,
  kFragmentRegion
};

// The NGConstraintSpace represents a set of constraints and available space
// which a layout algorithm may produce a NGFragment within.
class CORE_EXPORT NGConstraintSpace final
    : public RefCounted<NGConstraintSpace> {
 public:
  // This should live on NGBlockNode or another layout bridge and probably take
  // a root NGConstraintSpace.
  static RefPtr<NGConstraintSpace> CreateFromLayoutObject(const LayoutBox&);

  const std::shared_ptr<NGExclusions>& Exclusions() const {
    return exclusions_;
  }

  TextDirection Direction() const {
    return static_cast<TextDirection>(direction_);
  }

  NGWritingMode WritingMode() const {
    return static_cast<NGWritingMode>(writing_mode_);
  }

  void AddExclusion(const NGExclusion& exclusion);

  // The size to use for percentage resolution.
  // See: https://drafts.csswg.org/css-sizing/#percentage-sizing
  NGLogicalSize PercentageResolutionSize() const {
    return percentage_resolution_size_;
  }

  // The available space size.
  // See: https://drafts.csswg.org/css-sizing/#available
  NGLogicalSize AvailableSize() const { return available_size_; }

  // Return the block-direction space available in the current fragmentainer.
  LayoutUnit FragmentainerSpaceAvailable() const {
    DCHECK(HasBlockFragmentation());
    return fragmentainer_space_available_;
  }

  // Whether the current constraint space is for the newly established
  // Formatting Context.
  bool IsNewFormattingContext() const { return is_new_fc_; }

  // Whether the fragment produced from layout should be anonymous, (e.g. it
  // may be a column in a multi-column layout). In such cases it shouldn't have
  // any borders or padding.
  bool IsAnonymous() const { return is_anonymous_; }

  // Whether exceeding the AvailableSize() triggers the presence of a scrollbar
  // for the indicated direction.
  // If exceeded the current layout should be aborted and invoked again with a
  // constraint space modified to reserve space for a scrollbar.
  bool IsInlineDirectionTriggersScrollbar() const {
    return is_inline_direction_triggers_scrollbar_;
  }

  bool IsBlockDirectionTriggersScrollbar() const {
    return is_block_direction_triggers_scrollbar_;
  }

  // Some layout modes “stretch” their children to a fixed size (e.g. flex,
  // grid). These flags represented whether a layout needs to produce a
  // fragment that satisfies a fixed constraint in the inline and block
  // direction respectively.
  // If these flags are true, the AvailableSize() is interpreted as the fixed
  // border-box size of this box in the respective dimension.
  bool IsFixedSizeInline() const { return is_fixed_size_inline_; }

  bool IsFixedSizeBlock() const { return is_fixed_size_block_; }

  // Whether an auto inline-size should be interpreted as shrink-to-fit
  // (ie. fit-content). This is used for inline-block, floats, etc.
  bool IsShrinkToFit() const { return is_shrink_to_fit_; }

  // If specified a layout should produce a Fragment which fragments at the
  // blockSize if possible.
  NGFragmentationType BlockFragmentationType() const;

  // Returns a pointer to already existing Layout Opportunity iterator
  // associated with this constraint space and {@code iter_offset} or creates a
  // new one.
  NGLayoutOpportunityIterator* LayoutOpportunityIterator(
      const NGLogicalOffset& iter_offset);

  // Return true if this contraint space participates in a fragmentation
  // context.
  bool HasBlockFragmentation() const {
    return BlockFragmentationType() != kFragmentNone;
  }

  NGMarginStrut MarginStrut() const { return margin_strut_; }

  NGLogicalOffset BfcOffset() const { return bfc_offset_; }

  Vector<RefPtr<NGUnpositionedFloat>>& UnpositionedFloats() {
    return unpositioned_floats_;
  }

  WTF::Optional<LayoutUnit> ClearanceOffset() const {
    return clearance_offset_;
  }

  bool operator==(const NGConstraintSpace&) const;
  bool operator!=(const NGConstraintSpace&) const;

  String ToString() const;

 private:
  friend class NGConstraintSpaceBuilder;
  // Default constructor.
  NGConstraintSpace(NGWritingMode,
                    TextDirection,
                    NGLogicalSize available_size,
                    NGLogicalSize percentage_resolution_size,
                    NGPhysicalSize initial_containing_block_size,
                    LayoutUnit fragmentainer_space_available,
                    bool is_fixed_size_inline,
                    bool is_fixed_size_block,
                    bool is_shrink_to_fit,
                    bool is_inline_direction_triggers_scrollbar,
                    bool is_block_direction_triggers_scrollbar,
                    NGFragmentationType block_direction_fragmentation_type,
                    bool is_new_fc,
                    bool is_anonymous,
                    const NGMarginStrut& margin_strut,
                    const NGLogicalOffset& bfc_offset,
                    const std::shared_ptr<NGExclusions>& exclusions,
                    Vector<RefPtr<NGUnpositionedFloat>>& unpositioned_floats,
                    const WTF::Optional<LayoutUnit>& clearance_offset);

  NGPhysicalSize InitialContainingBlockSize() const {
    return initial_containing_block_size_;
  }

  NGLogicalSize available_size_;
  NGLogicalSize percentage_resolution_size_;
  NGPhysicalSize initial_containing_block_size_;

  LayoutUnit fragmentainer_space_available_;

  unsigned is_fixed_size_inline_ : 1;
  unsigned is_fixed_size_block_ : 1;

  unsigned is_shrink_to_fit_ : 1;

  unsigned is_inline_direction_triggers_scrollbar_ : 1;
  unsigned is_block_direction_triggers_scrollbar_ : 1;

  unsigned block_direction_fragmentation_type_ : 2;

  // Whether the current constraint space is for the newly established
  // formatting Context
  unsigned is_new_fc_ : 1;

  unsigned is_anonymous_ : 1;

  unsigned writing_mode_ : 3;
  unsigned direction_ : 1;

  NGMarginStrut margin_strut_;
  NGLogicalOffset bfc_offset_;
  const std::shared_ptr<NGExclusions> exclusions_;
  WTF::Optional<LayoutUnit> clearance_offset_;
  std::unique_ptr<NGLayoutOpportunityIterator> layout_opp_iter_;
  Vector<RefPtr<NGUnpositionedFloat>> unpositioned_floats_;
};

inline std::ostream& operator<<(std::ostream& stream,
                                const NGConstraintSpace& value) {
  return stream << value.ToString();
}

}  // namespace blink

#endif  // NGConstraintSpace_h
