// Copyright 2018 Samsung Electronics. All Rights Reserved.
//
// Licensed 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.

#include "starboard/shared/wayland/window_internal.h"

#include "starboard/log.h"

namespace {

const int kWindowWidth = 1920;
const int kWindowHeight = 1080;

// shell_surface_listener
void ShellSurfacePing(void*,
                      struct wl_shell_surface* shell_surface,
                      uint32_t serial) {
  wl_shell_surface_pong(shell_surface, serial);
}

void ShellSurfaceConfigure(void* data,
                           struct wl_shell_surface*,
                           uint32_t,
                           int32_t width,
                           int32_t height) {
  SB_DLOG(INFO) << "shell_surface_configure width(" << width << "), height("
                << height << ")";
  if (width && height) {
    SbWindowPrivate* window = reinterpret_cast<SbWindowPrivate*>(data);
    wl_egl_window_resize(window->egl_window, width, height, 0, 0);
  } else {
    SB_DLOG(INFO) << "width and height is 0. we don't resize that";
  }
}

void ShellSurfacePopupDone(void*, struct wl_shell_surface*) {}

struct wl_shell_surface_listener shell_surface_listener = {
    &ShellSurfacePing, &ShellSurfaceConfigure, &ShellSurfacePopupDone};
}  // namespace

SbWindowPrivate::SbWindowPrivate(wl_compositor* compositor,
                                 wl_shell* shell,
                                 const SbWindowOptions* options,
                                 float pixel_ratio) {
  width = kWindowWidth;
  height = kWindowHeight;
  video_pixel_ratio = pixel_ratio;

  if (options && options->size.width > 0 && options->size.height > 0) {
    width = options->size.width;
    height = options->size.height;
  }

  surface = wl_compositor_create_surface(compositor);
  shell_surface = wl_shell_get_shell_surface(shell, surface);
  wl_shell_surface_add_listener(shell_surface, &shell_surface_listener, this);
  wl_shell_surface_set_title(shell_surface, "cobalt");

  struct wl_region* region;
  region = wl_compositor_create_region(compositor);
  wl_region_add(region, 0, 0, width, height);
  wl_surface_set_opaque_region(surface, region);
  wl_region_destroy(region);

  egl_window = wl_egl_window_create(surface, width, height);

  WindowRaise();
}

SbWindowPrivate::~SbWindowPrivate() {
  wl_egl_window_destroy(egl_window);
  wl_shell_surface_destroy(shell_surface);
  wl_surface_destroy(surface);
}

void SbWindowPrivate::WindowRaise() {
  if (shell_surface)
    wl_shell_surface_set_toplevel(shell_surface);
}
