// 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.

#ifndef COMPONENTS_TRANSLATE_IOS_BROWSER_IOS_TRANSLATE_DRIVER_H_
#define COMPONENTS_TRANSLATE_IOS_BROWSER_IOS_TRANSLATE_DRIVER_H_

#include <string>

#include "base/basictypes.h"
#include "base/memory/weak_ptr.h"
#include "components/translate/core/browser/translate_driver.h"
#include "components/translate/ios/browser/language_detection_controller.h"
#include "components/translate/ios/browser/translate_controller.h"
#include "ios/web/public/web_state/web_state_observer.h"

@class CRWJSInjectionReceiver;

namespace web {
class NavigationManager;
class WebState;
}

namespace translate {

class TranslateManager;

// Content implementation of TranslateDriver.
class IOSTranslateDriver : public TranslateDriver,
                           public TranslateController::Observer,
                           public web::WebStateObserver {
 public:
  IOSTranslateDriver(web::WebState* web_state,
                     web::NavigationManager* navigation_manager,
                     TranslateManager* translate_manager);
  ~IOSTranslateDriver() override;

  LanguageDetectionController* language_detection_controller() {
    return language_detection_controller_.get();
  }

  TranslateController* translate_controller() {
    return translate_controller_.get();
  }

  // web::WebStateObserver methods.
  void NavigationItemCommitted(
      const web::LoadCommittedDetails& load_details) override;

  // TranslateDriver methods.
  void OnIsPageTranslatedChanged() override;
  void OnTranslateEnabledChanged() override;
  bool IsLinkNavigation() override;
  void TranslatePage(int page_seq_no,
                     const std::string& translate_script,
                     const std::string& source_lang,
                     const std::string& target_lang) override;
  void RevertTranslation(int page_seq_no) override;
  bool IsOffTheRecord() override;
  const std::string& GetContentsMimeType() override;
  const GURL& GetLastCommittedURL() override;
  const GURL& GetVisibleURL() override;
  bool HasCurrentPage() override;
  void OpenUrlInNewTab(const GURL& url) override;

 private:
  // Called when the translation was successful.
  void TranslationDidSucceed(const std::string& source_lang,
                             const std::string& target_lang,
                             int page_seq_no,
                             const std::string& original_page_language,
                             double translation_time);
  // Checks if the current running page translation is finished or errored and
  // notifies the browser accordingly.  If the translation has not terminated,
  // posts a task to check again later.
  // Similar to TranslateHelper::CheckTranslateStatus on desktop.
  void CheckTranslateStatus(const std::string& source_language,
                            const std::string& target_language,
                            int page_seq_no);

  // Returns true if the user has not navigated away and the the page is not
  // being destroyed.
  bool IsPageValid(int page_seq_no) const;

  // Callback for LanguageDetectionController.
  void OnLanguageDetermined(
      const LanguageDetectionController::DetectionDetails& details);

  // TranslateController::Observer methods.
  void OnTranslateScriptReady(bool success,
                              double load_time,
                              double ready_time) override;
  void OnTranslateComplete(bool success,
                           const std::string& original_language,
                           double translation_time) override;

  // The navigation manager of the tab we are associated with.
  web::NavigationManager* navigation_manager_;

  base::WeakPtr<TranslateManager> translate_manager_;
  scoped_ptr<TranslateController> translate_controller_;
  scoped_ptr<LanguageDetectionController> language_detection_controller_;
  scoped_ptr<LanguageDetectionController::CallbackList::Subscription>
      language_detection_callback_subscription_;

  // An ever-increasing sequence number of the current page, used to match up
  // translation requests with responses.
  // This matches the similar field in TranslateHelper in the renderer on other
  // platforms.
  int page_seq_no_;

  // When a translation is in progress, its page sequence number is stored in
  // |pending_page_seq_no_|.
  int pending_page_seq_no_;

  // Parameters of the current translation.
  std::string source_language_;
  std::string target_language_;

  base::WeakPtrFactory<IOSTranslateDriver> weak_method_factory_;

  DISALLOW_COPY_AND_ASSIGN(IOSTranslateDriver);
};

}  // namespace translate

#endif  // COMPONENTS_TRANSLATE_IOS_BROWSER_IOS_TRANSLATE_DRIVER_H_
