// Copyright 2017 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 "ios/chrome/browser/ui/activity_services/data/share_to_data_builder.h"

#include "base/check.h"
#import "base/strings/sys_string_conversions.h"
#import "components/send_tab_to_self/entry_point_display_reason.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
#import "ios/chrome/browser/sync/sync_service_factory.h"
#import "ios/chrome/browser/tabs/tab_title_util.h"
#include "ios/chrome/browser/ui/activity_services/data/chrome_activity_item_thumbnail_generator.h"
#include "ios/chrome/browser/ui/activity_services/data/share_to_data.h"
#import "ios/chrome/browser/ui/util/url_with_title.h"
#import "ios/web/public/navigation/navigation_item.h"
#import "ios/web/public/navigation/navigation_manager.h"
#import "ios/web/public/web_state.h"
#import "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace activity_services {

ShareToData* ShareToDataForWebState(web::WebState* web_state,
                                    const GURL& share_url) {
  // For crash documented in crbug.com/503955, tab.url which is being passed
  // as a reference parameter caused a crash due to invalid address which
  // suggests that tab may get closed along the way. Check that web_state
  // is still valid.
  if (!web_state)
    return nil;

  BOOL is_original_title = NO;
  DCHECK(web_state->GetNavigationManager());
  web::NavigationItem* last_committed_item =
      web_state->GetNavigationManager()->GetLastCommittedItem();
  if (last_committed_item) {
    // Do not use WebState::GetTitle() as it returns the display title, not the
    // original page title.
    const std::u16string& original_title = last_committed_item->GetTitle();
    if (!original_title.empty()) {
      // If the original page title exists, it is expected to match the Tab's
      // title. If this ever changes, then a decision has to be made on which
      // one should be used for sharing.
      DCHECK([tab_util::GetTabTitle(web_state)
          isEqual:base::SysUTF16ToNSString(original_title)]);
      is_original_title = YES;
    }
  }

  BOOL is_page_printable = [web_state->GetView() viewPrintFormatter] != nil;

  // Thumbnail should not be generated for incognito tabs.
  ChromeActivityItemThumbnailGenerator* thumbnail_generator =
      web_state->GetBrowserState()->IsOffTheRecord()
          ? nil
          : [[ChromeActivityItemThumbnailGenerator alloc]
                initWithWebState:web_state];

  const GURL& finalURLToShare =
      !share_url.is_empty() ? share_url : web_state->GetVisibleURL();
  web::NavigationItem* visibleItem =
      web_state->GetNavigationManager()->GetVisibleItem();
  web::UserAgentType userAgent = web::UserAgentType::NONE;
  if (visibleItem)
    userAgent = visibleItem->GetUserAgentType();

  FindTabHelper* helper = FindTabHelper::FromWebState(web_state);
  BOOL is_page_searchable =
      (helper && helper->CurrentPageSupportsFindInPage() &&
       !helper->IsFindUIActive());
  NSString* tab_title = tab_util::GetTabTitle(web_state);

  ChromeBrowserState* browser_state =
      ChromeBrowserState::FromBrowserState(web_state->GetBrowserState());
  BOOL can_send_tab_to_self =
      send_tab_to_self::GetEntryPointDisplayReason(
          finalURLToShare,
          SyncServiceFactory::GetForBrowserState(browser_state),
          SendTabToSelfSyncServiceFactory::GetForBrowserState(browser_state),
          browser_state->GetPrefs())
          .has_value();

  return [[ShareToData alloc] initWithShareURL:finalURLToShare
                                    visibleURL:web_state->GetVisibleURL()
                                         title:tab_title
                                additionalText:nil
                               isOriginalTitle:is_original_title
                               isPagePrintable:is_page_printable
                              isPageSearchable:is_page_searchable
                              canSendTabToSelf:can_send_tab_to_self
                                     userAgent:userAgent
                            thumbnailGenerator:thumbnail_generator];
}

ShareToData* ShareToDataForURL(const GURL& URL,
                               NSString* title,
                               NSString* additionalText) {
  return [[ShareToData alloc] initWithShareURL:URL
                                    visibleURL:URL
                                         title:title
                                additionalText:additionalText
                               isOriginalTitle:YES
                               isPagePrintable:NO
                              isPageSearchable:NO
                              canSendTabToSelf:NO
                                     userAgent:web::UserAgentType::NONE
                            thumbnailGenerator:nil];
}

ShareToData* ShareToDataForURLWithTitle(URLWithTitle* URLWithTitle) {
  return ShareToDataForURL(URLWithTitle.URL, URLWithTitle.title, nil);
}

}  // namespace activity_services
