// Copyright 2015 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 APPS_MOTERM_MOTERM_VIEW_H_
#define APPS_MOTERM_MOTERM_VIEW_H_

#include "apps/moterm/gl_helper.h"
#include "apps/moterm/moterm_driver.h"
#include "apps/moterm/moterm_model.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "mojo/common/binding_set.h"
#include "mojo/public/cpp/application/interface_factory.h"
#include "mojo/public/cpp/application/service_provider_impl.h"
#include "mojo/public/cpp/bindings/callback.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/services/surfaces/interfaces/surface_id.mojom.h"
#include "mojo/services/terminal/interfaces/terminal.mojom.h"
#include "mojo/services/view_manager/cpp/view_observer.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkBitmapDevice.h"
#include "third_party/skia/include/core/SkTypeface.h"

namespace mojo {
class Shell;
}

class MotermView : public mojo::ViewObserver,
                   public GlHelper::Client,
                   public MotermModel::Delegate,
                   public MotermDriver::Client,
                   public mojo::InterfaceFactory<mojo::terminal::Terminal>,
                   public mojo::terminal::Terminal {
 public:
  MotermView(
      mojo::Shell* shell,
      mojo::View* view,
      mojo::InterfaceRequest<mojo::ServiceProvider> service_provider_request);
  ~MotermView() override;

 private:
  // |mojo::ViewObserver|:
  void OnViewDestroyed(mojo::View* view) override;
  void OnViewBoundsChanged(mojo::View* view,
                           const mojo::Rect& old_bounds,
                           const mojo::Rect& new_bounds) override;
  void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override;

  // |GlHelper::Client|:
  void OnSurfaceIdChanged(mojo::SurfaceIdPtr surface_id) override;
  void OnContextLost() override;
  void OnFrameDisplayed(uint32_t frame_id) override;

  // |MotermModel::Delegate|:
  void OnResponse(const void* buf, size_t size) override;
  void OnSetKeypadMode(bool application_mode) override;

  // |MotermDriver::Client|:
  void OnDataReceived(const void* bytes, size_t num_bytes) override;
  void OnClosed() override;
  void OnDestroyed() override;

  // |mojo::InterfaceFactory<mojo::terminal::Terminal>|:
  void Create(
      mojo::ApplicationConnection* connection,
      mojo::InterfaceRequest<mojo::terminal::Terminal> request) override;

  // |mojo::terminal::Terminal| implementation:
  void Connect(mojo::InterfaceRequest<mojo::files::File> terminal_file,
               bool force,
               const ConnectCallback& callback) override;
  void ConnectToClient(mojo::terminal::TerminalClientPtr terminal_client,
                       bool force,
                       const ConnectToClientCallback& callback) override;
  void GetSize(const GetSizeCallback& callback) override;
  void SetSize(uint32_t rows,
               uint32_t columns,
               bool reset,
               const SetSizeCallback& callback) override;

  // If |force| is true, it will draw everything. Otherwise it will draw only if
  // |model_state_changes_| is dirty.
  void Draw(bool force);

  void OnKeyPressed(const mojo::EventPtr& key_event);

  mojo::View* const view_;
  GlHelper gl_helper_;

  // TODO(vtl): Consider the structure of this app. Do we really want the "view"
  // owning the model?
  // The terminal model.
  MotermModel model_;
  // State changes to the model since last draw.
  MotermModel::StateChanges model_state_changes_;

  base::WeakPtr<MotermDriver> driver_;
  // If set, called when we get |OnClosed()| or |OnDestroyed()| from the driver.
  mojo::Closure on_closed_callback_;

  mojo::ServiceProviderImpl service_provider_impl_;
  mojo::BindingSet<mojo::terminal::Terminal> terminal_bindings_;

  // TODO(vtl): For some reason, drawing while a frame is already pending (i.e.,
  // we've submitted it but haven't gotten a callback) interacts badly with
  // resizing -- sometimes this results in us losing all future
  // |OnViewBoundsChanged()| messages. So, for now, don't submit frames in that
  // case.
  bool frame_pending_;
  // If we skip drawing despite being forced to, we should force the next draw.
  bool force_next_draw_;

  skia::RefPtr<SkTypeface> regular_typeface_;

  int ascent_;
  int line_height_;
  int advance_width_;

  skia::RefPtr<SkBitmapDevice> bitmap_device_;

  // Keyboard state.
  bool keypad_application_mode_;

  DISALLOW_COPY_AND_ASSIGN(MotermView);
};

#endif  // APPS_MOTERM_MOTERM_VIEW_H_
