// 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.

#include "ui/display/display_layout_builder.h"

#include <algorithm>

#include "ui/display/display.h"

namespace display {

DisplayLayoutBuilder::DisplayLayoutBuilder(const DisplayLayout& layout)
    : layout_(layout.Copy()) {}

DisplayLayoutBuilder::DisplayLayoutBuilder(int64_t primary_id)
    : layout_(new DisplayLayout) {
  layout_->primary_id = primary_id;
}

DisplayLayoutBuilder::~DisplayLayoutBuilder() {}

DisplayLayoutBuilder& DisplayLayoutBuilder::SetDefaultUnified(
    bool default_unified) {
  layout_->default_unified = default_unified;
  return *this;
}

DisplayLayoutBuilder& DisplayLayoutBuilder::ClearPlacements() {
  layout_->placement_list.clear();
  return *this;
}

DisplayLayoutBuilder& DisplayLayoutBuilder::AddDisplayPlacement(
    int64_t display_id,
    int64_t parent_display_id,
    DisplayPlacement::Position position,
    int offset) {
  DisplayPlacement placement;
  placement.position = position;
  placement.offset = offset;
  placement.display_id = display_id;
  placement.parent_display_id = parent_display_id;
  AddDisplayPlacement(placement);
  return *this;
}

DisplayLayoutBuilder& DisplayLayoutBuilder::AddDisplayPlacement(
    const DisplayPlacement& placement) {
  layout_->placement_list.push_back(placement);
  return *this;
}

DisplayLayoutBuilder& DisplayLayoutBuilder::SetSecondaryPlacement(
    int64_t secondary_id,
    DisplayPlacement::Position position,
    int offset) {
  layout_->placement_list.clear();
  AddDisplayPlacement(secondary_id, layout_->primary_id, position, offset);
  return *this;
}

std::unique_ptr<DisplayLayout> DisplayLayoutBuilder::Build() {
  std::sort(layout_->placement_list.begin(), layout_->placement_list.end(),
            [](const DisplayPlacement& a, const DisplayPlacement& b) {
              return CompareDisplayIds(a.display_id, b.display_id);
            });
  return std::move(layout_);
}

}  // namespace display
