// Copyright 2014 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 "remoting/host/it2me/it2me_confirmation_dialog_proxy.h"

#include <utility>

#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/threading/thread_task_runner_handle.h"

namespace remoting {

class It2MeConfirmationDialogProxy::Core {
 public:
  Core(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
       base::WeakPtr<It2MeConfirmationDialogProxy> parent,
       std::unique_ptr<It2MeConfirmationDialog> dialog);
  ~Core();

  // Shows the wrapped dialog. Must be called on the UI thread.
  void Show(const std::string& remote_user_email);

  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() {
    return ui_task_runner_;
  }

  scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner() {
    return caller_task_runner_;
  }

 private:
  // Reports the dialog result on the caller's thread.
  void ReportResult(It2MeConfirmationDialog::Result result);

  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
  scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
  base::WeakPtr<It2MeConfirmationDialogProxy> parent_;
  std::unique_ptr<It2MeConfirmationDialog> dialog_;

  DISALLOW_COPY_AND_ASSIGN(Core);
};

It2MeConfirmationDialogProxy::Core::Core(
    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
    base::WeakPtr<It2MeConfirmationDialogProxy> parent,
    std::unique_ptr<It2MeConfirmationDialog> dialog)
    : ui_task_runner_(ui_task_runner),
      caller_task_runner_(caller_task_runner),
      parent_(parent),
      dialog_(std::move(dialog)) {}

It2MeConfirmationDialogProxy::Core::~Core() {
  DCHECK(ui_task_runner_->BelongsToCurrentThread());
}

void It2MeConfirmationDialogProxy::Core::Show(
    const std::string& remote_user_email) {
  DCHECK(ui_task_runner_->BelongsToCurrentThread());

  dialog_->Show(remote_user_email,
                base::Bind(&It2MeConfirmationDialogProxy::Core::ReportResult,
                           base::Unretained(this)));
}

void It2MeConfirmationDialogProxy::Core::ReportResult(
    It2MeConfirmationDialog::Result result) {
  DCHECK(ui_task_runner_->BelongsToCurrentThread());
  caller_task_runner_->PostTask(
      FROM_HERE,
      base::Bind(&It2MeConfirmationDialogProxy::ReportResult, parent_, result));
}

It2MeConfirmationDialogProxy::It2MeConfirmationDialogProxy(
    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
    std::unique_ptr<It2MeConfirmationDialog> dialog)
    : weak_factory_(this) {
  core_.reset(new Core(ui_task_runner, base::ThreadTaskRunnerHandle::Get(),
                       weak_factory_.GetWeakPtr(), std::move(dialog)));
}

It2MeConfirmationDialogProxy::~It2MeConfirmationDialogProxy() {
  DCHECK(core_->caller_task_runner()->BelongsToCurrentThread());

  auto ui_task_runner = core_->ui_task_runner();
  ui_task_runner->DeleteSoon(FROM_HERE, core_.release());
}

void It2MeConfirmationDialogProxy::Show(
    const std::string& remote_user_email,
    const It2MeConfirmationDialog::ResultCallback& callback) {
  DCHECK(core_->caller_task_runner()->BelongsToCurrentThread());

  callback_ = callback;
  core_->ui_task_runner()->PostTask(
      FROM_HERE, base::Bind(&Core::Show, base::Unretained(core_.get()),
                            remote_user_email));
}

void It2MeConfirmationDialogProxy::ReportResult(
    It2MeConfirmationDialog::Result result) {
  DCHECK(core_->caller_task_runner()->BelongsToCurrentThread());
  base::ResetAndReturn(&callback_).Run(result);
}

}  // namespace remoting
