// Copyright (c) 2013 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.
//
// An object to record and send user feedback to spelling service. The spelling
// service uses the feedback to improve its suggestions.
//
// Assigns uint32 hash identifiers to spelling suggestions from spelling service
// and stores these suggestions. Records user's actions on these suggestions.
// Periodically sends batches of user feedback to the spelling service.

#ifndef CHROME_BROWSER_SPELLCHECKER_FEEDBACK_SENDER_H_
#define CHROME_BROWSER_SPELLCHECKER_FEEDBACK_SENDER_H_

#include <map>
#include <set>
#include <vector>

#include "base/memory/scoped_vector.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
#include "chrome/browser/spellchecker/feedback.h"
#include "chrome/browser/spellchecker/misspelling.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h"

class SpellCheckMarker;
struct SpellCheckResult;

namespace net {
class URLFetcher;
class URLRequestContextGetter;
}

namespace spellcheck {

namespace {

// Constants for the feedback field trial.
const char kFeedbackFieldTrialName[] = "SpellingServiceFeedback";
const char kFeedbackFieldTrialEnabledGroupName[] = "Enabled";

}  // namespace

// Stores and sends user feedback to the spelling service. Sample usage:
//    FeedbackSender sender(profile.GetRequestContext(), language, country);
//    sender.OnSpellcheckResults(spellcheck_results_from_spelling_service,
//                               renderer_process_id,
//                               spellchecked_text,
//                               existing_hashes);
//    sender.SelectedSuggestion(hash, suggestion_index);
class FeedbackSender : public base::SupportsWeakPtr<FeedbackSender>,
                       public net::URLFetcherDelegate {
 public:
  // Constructs a feedback sender. Keeps |request_context| in a scoped_refptr,
  // because URLRequestContextGetter implements RefcountedThreadSafe.
  FeedbackSender(net::URLRequestContextGetter* request_context,
                 const std::string& language,
                 const std::string& country);
  virtual ~FeedbackSender();

  // Records that user selected suggestion |suggestion_index| for the
  // misspelling identified by |hash|.
  void SelectedSuggestion(uint32 hash, int suggestion_index);

  // Records that user added the misspelling identified by |hash| to the
  // dictionary.
  void AddedToDictionary(uint32 hash);

  // Records that user right-clicked on the misspelling identified by |hash|,
  // but did not select any suggestion.
  void IgnoredSuggestions(uint32 hash);

  // Records that user did not choose any suggestion but manually corrected the
  // misspelling identified by |hash| to string |correction|, which is not in
  // the list of suggestions.
  void ManuallyCorrected(uint32 hash, const base::string16& correction);

  // Records that user has the misspelling in the custom dictionary. The user
  // will never see the spellcheck suggestions for the misspelling.
  void RecordInDictionary(uint32 hash);

  // Receives document markers for renderer with process ID |render_process_id|
  // when the renderer responds to a RequestDocumentMarkers() call. Finalizes
  // feedback for the markers that are gone from the renderer. Sends feedback
  // data for the renderer with process ID |renderer_process_id| to the spelling
  // service. If the current session has expired, then refreshes the session
  // start timestamp and sends out all of the feedback data.
  void OnReceiveDocumentMarkers(int renderer_process_id,
                                const std::vector<uint32>& markers);

  // Generates feedback data based on spellcheck results. The new feedback data
  // is pending. Sets hash identifiers for |results|. Called when spelling
  // service client receives results from the spelling service. Does not take
  // ownership of |results|.
  void OnSpellcheckResults(int renderer_process_id,
                           const base::string16& text,
                           const std::vector<SpellCheckMarker>& markers,
                           std::vector<SpellCheckResult>* results);

  // Receives updated language and country code for feedback. Finalizes and
  // sends out all of the feedback data.
  void OnLanguageCountryChange(const std::string& language,
                               const std::string& country);

  // Starts collecting feedback, if it's not already being collected.
  void StartFeedbackCollection();

  // Sends out all previously collected data and stops collecting feedback, if
  // it was being collected.
  void StopFeedbackCollection();

 private:
  friend class FeedbackSenderTest;

  // net::URLFetcherDelegate implementation. Takes ownership of |source|.
  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;

  // Requests the document markers from all of the renderers to determine which
  // feedback can be finalized. Finalizes feedback for renderers that are gone.
  // Called periodically when |timer_| fires.
  void RequestDocumentMarkers();

  // Sends out all feedback data. Resets the session-start timestamp to now.
  // Restarts the timer that requests markers from the renderers.
  void FlushFeedback();

  // Sends out the |feedback_data|.
  void SendFeedback(const std::vector<Misspelling>& feedback_data,
                    bool is_first_feedback_batch);

  // URL request context for the feedback senders.
  scoped_refptr<net::URLRequestContextGetter> request_context_;

  // The feedback API version.
  const std::string api_version_;

  // The language of text. The string is a BCP 47 language tag.
  std::string language_;

  // The country of origin. The string is the ISO 3166-1 alpha-3 code.
  std::string country_;

  // Misspelling counter used to generate unique hash identifier for each
  // misspelling.
  size_t misspelling_counter_;

  // Feedback data.
  Feedback feedback_;

  // A set of renderer process IDs for renderers that have sent out feedback in
  // this session.
  std::set<int> renderers_sent_feedback_;

  // When the session started.
  base::Time session_start_;

  // The URL where the feedback data should be sent.
  GURL feedback_service_url_;

  // A timer to periodically request a list of document spelling markers from
  // all of the renderers. The timer starts in StartFeedbackCollection() and
  // stops in StopFeedbackCollection(). The timer stops and abandons its tasks
  // on destruction.
  base::RepeatingTimer<FeedbackSender> timer_;

  // Feedback senders that need to stay alive for the duration of sending data.
  // If a sender is destroyed before it finishes, then sending feedback will be
  // canceled.
  ScopedVector<net::URLFetcher> senders_;

  DISALLOW_COPY_AND_ASSIGN(FeedbackSender);
};

}  // namespace spellcheck

#endif  // CHROME_BROWSER_SPELLCHECKER_FEEDBACK_SENDER_H_
