// Copyright 2018 The Chromium OS 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 "sommelier.h"  // NOLINT(build/include_directory)
#include "sommelier-tracing.h"  // NOLINT(build/include_directory)

#include <assert.h>
#include <stdlib.h>
#include <wayland-client.h>

struct sl_host_shell_surface {
  struct wl_resource* resource;
  struct wl_shell_surface* proxy;
};

struct sl_host_shell {
  struct sl_shell* shell;
  struct wl_resource* resource;
  struct wl_shell* proxy;
};

static void sl_shell_surface_pong(struct wl_client* client,
                                  struct wl_resource* resource,
                                  uint32_t serial) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));

  wl_shell_surface_pong(host->proxy, serial);
}

static void sl_shell_surface_move(struct wl_client* client,
                                  struct wl_resource* resource,
                                  struct wl_resource* seat_resource,
                                  uint32_t serial) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));
  struct sl_host_seat* host_seat =
      static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource));

  wl_shell_surface_move(host->proxy, host_seat->proxy, serial);
}  // NOLINT(whitespace/indent)

static void sl_shell_surface_resize(struct wl_client* client,
                                    struct wl_resource* resource,
                                    struct wl_resource* seat_resource,
                                    uint32_t serial,
                                    uint32_t edges) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));
  struct sl_host_seat* host_seat =
      static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource));

  wl_shell_surface_resize(host->proxy, host_seat->proxy, serial, edges);
}  // NOLINT(whitespace/indent)

static void sl_shell_surface_set_toplevel(struct wl_client* client,
                                          struct wl_resource* resource) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));

  wl_shell_surface_set_toplevel(host->proxy);
}

static void sl_shell_surface_set_transient(struct wl_client* client,
                                           struct wl_resource* resource,
                                           struct wl_resource* parent_resource,
                                           int32_t x,
                                           int32_t y,
                                           uint32_t flags) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));
  struct sl_host_surface* host_parent =
      static_cast<sl_host_surface*>(wl_resource_get_user_data(parent_resource));

  wl_shell_surface_set_transient(host->proxy, host_parent->proxy, x, y, flags);
}  // NOLINT(whitespace/indent)

static void sl_shell_surface_set_fullscreen(
    struct wl_client* client,
    struct wl_resource* resource,
    uint32_t method,
    uint32_t framerate,
    struct wl_resource* output_resource) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));
  struct sl_host_output* host_output =
      output_resource ? static_cast<sl_host_output*>(
                            wl_resource_get_user_data(output_resource))
                      : NULL;

  wl_shell_surface_set_fullscreen(host->proxy, method, framerate,
                                  host_output ? host_output->proxy : NULL);
}  // NOLINT(whitespace/indent)

static void sl_shell_surface_set_popup(struct wl_client* client,
                                       struct wl_resource* resource,
                                       struct wl_resource* seat_resource,
                                       uint32_t serial,
                                       struct wl_resource* parent_resource,
                                       int32_t x,
                                       int32_t y,
                                       uint32_t flags) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));
  struct sl_host_seat* host_seat =
      static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource));
  struct sl_host_surface* host_parent =
      static_cast<sl_host_surface*>(wl_resource_get_user_data(parent_resource));

  wl_shell_surface_set_popup(host->proxy, host_seat->proxy, serial,
                             host_parent->proxy, x, y, flags);
}  // NOLINT(whitespace/indent)

static void sl_shell_surface_set_maximized(
    struct wl_client* client,
    struct wl_resource* resource,
    struct wl_resource* output_resource) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));
  struct sl_host_output* host_output =
      output_resource ? static_cast<sl_host_output*>(
                            wl_resource_get_user_data(output_resource))
                      : NULL;

  wl_shell_surface_set_maximized(host->proxy,
                                 host_output ? host_output->proxy : NULL);
}  // NOLINT(whitespace/indent)

static void sl_shell_surface_set_title(struct wl_client* client,
                                       struct wl_resource* resource,
                                       const char* title) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));

  wl_shell_surface_set_title(host->proxy, title);
}

static void sl_shell_surface_set_class(struct wl_client* client,
                                       struct wl_resource* resource,
                                       const char* clazz) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));

  wl_shell_surface_set_class(host->proxy, clazz);
}

static const struct wl_shell_surface_interface sl_shell_surface_implementation =
    {sl_shell_surface_pong,          sl_shell_surface_move,
     sl_shell_surface_resize,        sl_shell_surface_set_toplevel,
     sl_shell_surface_set_transient, sl_shell_surface_set_fullscreen,
     sl_shell_surface_set_popup,     sl_shell_surface_set_maximized,
     sl_shell_surface_set_title,     sl_shell_surface_set_class};

static void sl_shell_surface_ping(void* data,
                                  struct wl_shell_surface* shell_surface,
                                  uint32_t serial) {
  struct sl_host_shell_surface* host = static_cast<sl_host_shell_surface*>(
      wl_shell_surface_get_user_data(shell_surface));

  wl_shell_surface_send_ping(host->resource, serial);
}

static void sl_shell_surface_configure(void* data,
                                       struct wl_shell_surface* shell_surface,
                                       uint32_t edges,
                                       int32_t width,
                                       int32_t height) {
  TRACE_EVENT("shell", "sl_shell_surface_configure");
  struct sl_host_shell_surface* host = static_cast<sl_host_shell_surface*>(
      wl_shell_surface_get_user_data(shell_surface));

  wl_shell_surface_send_configure(host->resource, edges, width, height);
}

static void sl_shell_surface_popup_done(
    void* data, struct wl_shell_surface* shell_surface) {
  struct sl_host_shell_surface* host = static_cast<sl_host_shell_surface*>(
      wl_shell_surface_get_user_data(shell_surface));

  wl_shell_surface_send_popup_done(host->resource);
}

static const struct wl_shell_surface_listener sl_shell_surface_listener = {
    sl_shell_surface_ping, sl_shell_surface_configure,
    sl_shell_surface_popup_done};

static void sl_destroy_host_shell_surface(struct wl_resource* resource) {
  struct sl_host_shell_surface* host =
      static_cast<sl_host_shell_surface*>(wl_resource_get_user_data(resource));

  wl_shell_surface_destroy(host->proxy);
  wl_resource_set_user_data(resource, NULL);
  free(host);
}

static void sl_host_shell_get_shell_surface(
    struct wl_client* client,
    struct wl_resource* resource,
    uint32_t id,
    struct wl_resource* surface_resource) {
  struct sl_host_shell* host =
      static_cast<sl_host_shell*>(wl_resource_get_user_data(resource));
  struct sl_host_surface* host_surface = static_cast<sl_host_surface*>(
      wl_resource_get_user_data(surface_resource));
  struct sl_host_shell_surface* host_shell_surface =
      static_cast<sl_host_shell_surface*>(malloc(sizeof(*host_shell_surface)));
  assert(host_shell_surface);
  host_shell_surface->resource =
      wl_resource_create(client, &wl_shell_surface_interface, 1, id);
  wl_resource_set_implementation(
      host_shell_surface->resource, &sl_shell_surface_implementation,
      host_shell_surface, sl_destroy_host_shell_surface);
  host_shell_surface->proxy =
      wl_shell_get_shell_surface(host->proxy, host_surface->proxy);
  wl_shell_surface_set_user_data(host_shell_surface->proxy, host_shell_surface);
  wl_shell_surface_add_listener(host_shell_surface->proxy,
                                &sl_shell_surface_listener, host_shell_surface);
  host_surface->has_role = 1;
}  // NOLINT(whitespace/indent)

static const struct wl_shell_interface sl_shell_implementation = {
    sl_host_shell_get_shell_surface};

static void sl_destroy_host_shell(struct wl_resource* resource) {
  struct sl_host_shell* host =
      static_cast<sl_host_shell*>(wl_resource_get_user_data(resource));

  wl_shell_destroy(host->proxy);
  wl_resource_set_user_data(resource, NULL);
  free(host);
}

static void sl_bind_host_shell(struct wl_client* client,
                               void* data,
                               uint32_t version,
                               uint32_t id) {
  struct sl_context* ctx = (struct sl_context*)data;
  struct sl_host_shell* host =
      static_cast<sl_host_shell*>(malloc(sizeof(*host)));
  assert(host);
  host->shell = ctx->shell;
  host->resource = wl_resource_create(client, &wl_shell_interface, 1, id);
  wl_resource_set_implementation(host->resource, &sl_shell_implementation, host,
                                 sl_destroy_host_shell);
  host->proxy = static_cast<wl_shell*>(wl_registry_bind(
      wl_display_get_registry(ctx->display), ctx->shell->id,
      &wl_shell_interface, wl_resource_get_version(host->resource)));
  wl_shell_set_user_data(host->proxy, host);
}

struct sl_global* sl_shell_global_create(struct sl_context* ctx) {
  return sl_global_create(ctx, &wl_shell_interface, 1, ctx, sl_bind_host_shell);
}
