// Copyright 2019 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 "components/send_tab_to_self/send_tab_to_self_infobar_delegate.h"

#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
#include "components/send_tab_to_self/send_tab_to_self_entry.h"
#include "content/public/browser/web_contents.h"
#include "url/gurl.h"

namespace send_tab_to_self {

// static
std::unique_ptr<SendTabToSelfInfoBarDelegate>
SendTabToSelfInfoBarDelegate::Create(content::WebContents* web_contents,
                                     const SendTabToSelfEntry* entry) {
  return base::WrapUnique(
      new SendTabToSelfInfoBarDelegate(web_contents, entry));
}

SendTabToSelfInfoBarDelegate::~SendTabToSelfInfoBarDelegate() {}

base::string16 SendTabToSelfInfoBarDelegate::GetInfobarMessage() const {
  // TODO(crbug.com/944602): Define real string.
  NOTIMPLEMENTED();
  return base::UTF8ToUTF16("Open");
}

void SendTabToSelfInfoBarDelegate::OpenTab() {
  content::OpenURLParams open_url_params(
      entry_->GetURL(), content::Referrer(),
      WindowOpenDisposition::NEW_FOREGROUND_TAB,
      ui::PageTransition::PAGE_TRANSITION_LINK,
      false /* is_renderer_initiated */);
  web_contents_->OpenURL(open_url_params);

  // TODO(crbug.com/944602): Update the model to reflect that an infobar is
  // shown.
}

void SendTabToSelfInfoBarDelegate::InfoBarDismissed() {
  NOTIMPLEMENTED();
}

infobars::InfoBarDelegate::InfoBarIdentifier
SendTabToSelfInfoBarDelegate::GetIdentifier() const {
  return SEND_TAB_TO_SELF_INFOBAR_DELEGATE;
}

SendTabToSelfInfoBarDelegate::SendTabToSelfInfoBarDelegate(
    content::WebContents* web_contents,
    const SendTabToSelfEntry* entry) {
  web_contents_ = web_contents;
  entry_ = entry;
}

}  // namespace send_tab_to_self
