/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#ifndef CORE_RENDER_NODE_RENDER_LIST_H_
#define CORE_RENDER_NODE_RENDER_LIST_H_

#include <map>
#include <string>
#include <vector>

#include "core/css/constants_value.h"
#include "core/render/node/render_object.h"

namespace WeexCore {

class RenderList : public RenderObject {
 public:
  ~RenderList();

  void set_flex(const float flex);

  void AddCellSlotCopyTrack(RenderObject *cell_slot);

  std::map<std::string, std::string> *GetDefaultStyle();

  std::map<std::string, std::string> *GetDefaultAttr();

  void PreCalculateCellWidth();

  std::string CalculateSpanOffset();

  float TakeStyleWidth();

  int AddRenderObject(int index, RenderObject *child);

  void AddRenderObjectWidth(RenderObject *child, const bool updating);

  void UpdateAttr(std::string key, std::string value);

  float TakeColumnCount();

  float TakeColumnGap();

  float TakeColumnWidth();

  float TakeLeftGap();

  float TakeRightGap();

  int TakeOrientation();

  inline float CalculateFreeSpaceAlongMainAxis(
      const float &width, const float &height,
      const float &currentLength) const override {
    return NAN;
  }

  inline std::vector<RenderObject *> &CellSlots() { return cell_slots_; }

 private:
  bool is_pre_calculate_cell_width_ = false;
  int column_count_ = COLUMN_COUNT_NORMAL;
  float column_width_ = AUTO_VALUE;
  float available_width_ = 0;
  float column_gap_ = COLUMN_GAP_NORMAL;
  bool is_set_flex_ = false;
  std::vector<RenderObject *> cell_slots_;
  std::vector<RenderObject *> cell_slots_copys_;
  float left_gap_ = 0;
  float right_gap_ = 0;
};
}  // namespace WeexCore

#endif  // CORE_RENDER_NODE_RENDER_LIST_H_
