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

#ifndef IOS_WEB_DOWNLOAD_DOWNLOAD_TASK_IMPL_H_
#define IOS_WEB_DOWNLOAD_DOWNLOAD_TASK_IMPL_H_

#include <string>

#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#import "ios/web/public/download/download_task.h"
#include "url/gurl.h"

@class NSURLSession;

namespace net {
class URLFetcherResponseWriter;
class URLRequestContextGetter;
}

namespace web {

class DownloadTaskObserver;
class WebState;

// Implements DownloadTask interface. Uses background NSURLSession as
// implementation.
class DownloadTaskImpl : public DownloadTask {
 public:
  class Delegate {
   public:
    // Called when download task is about to be destroyed. Delegate should
    // remove all references to the given DownloadTask and stop using it.
    virtual void OnTaskDestroyed(DownloadTaskImpl* task) = 0;

    // Creates background NSURLSession with given |identifier|, |cookies|,
    // |delegate| and |delegate_queue|.
    virtual NSURLSession* CreateSession(NSString* identifier,
                                        NSArray<NSHTTPCookie*>* cookies,
                                        id<NSURLSessionDataDelegate> delegate,
                                        NSOperationQueue* delegate_queue) = 0;
    virtual ~Delegate() = default;
  };

  // Constructs a new DownloadTaskImpl objects. |web_state|, |identifier| and
  // |delegate| must be valid.
  DownloadTaskImpl(const WebState* web_state,
                   const GURL& original_url,
                   const std::string& content_disposition,
                   int64_t total_bytes,
                   const std::string& mime_type,
                   ui::PageTransition page_transition,
                   NSString* identifier,
                   Delegate* delegate);

  // Stops the download operation and clears the delegate.
  void ShutDown();

  // DownloadTask overrides:
  DownloadTask::State GetState() const override;
  void Start(std::unique_ptr<net::URLFetcherResponseWriter> writer) override;
  void Cancel() override;
  net::URLFetcherResponseWriter* GetResponseWriter() const override;
  NSString* GetIndentifier() const override;
  const GURL& GetOriginalUrl() const override;
  bool IsDone() const override;
  int GetErrorCode() const override;
  int GetHttpCode() const override;
  int64_t GetTotalBytes() const override;
  int64_t GetReceivedBytes() const override;
  int GetPercentComplete() const override;
  std::string GetContentDisposition() const override;
  std::string GetOriginalMimeType() const override;
  std::string GetMimeType() const override;
  ui::PageTransition GetTransitionType() const override;
  base::string16 GetSuggestedFilename() const override;
  bool HasPerformedBackgroundDownload() const override;
  void AddObserver(DownloadTaskObserver* observer) override;
  void RemoveObserver(DownloadTaskObserver* observer) override;
  ~DownloadTaskImpl() override;

 private:
  // Creates background NSURLSession with given |identifier| and |cookies|.
  NSURLSession* CreateSession(NSString* identifier,
                              NSArray<NSHTTPCookie*>* cookies);

  // Asynchronously returns cookies for WebState associated with this task.
  // Must be called on UI thread. The callback will be invoked on the UI thread.
  void GetCookies(base::Callback<void(NSArray<NSHTTPCookie*>*)> callback);

  // Asynchronously returns cookies for |context_getter|. Must
  // be called on IO thread. The callback will be invoked on the UI thread.
  static void GetCookiesFromContextGetter(
      scoped_refptr<net::URLRequestContextGetter> context_getter,
      base::Callback<void(NSArray<NSHTTPCookie*>*)> callback);

  // Starts the download with given cookies.
  void StartWithCookies(NSArray<NSHTTPCookie*>* cookies);

  // Starts parsing data:// url. Separate code path is used because
  // NSURLSession does not support data URLs.
  void StartDataUrlParsing();

  // Called when download task was updated.
  void OnDownloadUpdated();

  // Called when download was completed and the data writing was finished.
  void OnDownloadFinished(int error_code);

  // Called when data:// url parsing has completed and the data has been
  // written.
  void OnDataUrlWritten(int bytes_written);

  // A list of observers. Weak references.
  base::ObserverList<DownloadTaskObserver, true>::Unchecked observers_;

  // Back up corresponding public methods of DownloadTask interface.
  State state_ = State::kNotStarted;
  std::unique_ptr<net::URLFetcherResponseWriter> writer_;
  GURL original_url_;
  int error_code_ = 0;
  int http_code_ = -1;
  int64_t total_bytes_ = -1;
  int64_t received_bytes_ = 0;
  int percent_complete_ = -1;
  std::string content_disposition_;
  std::string original_mime_type_;
  std::string mime_type_;
  ui::PageTransition page_transition_ = ui::PAGE_TRANSITION_LINK;
  NSString* identifier_ = nil;
  bool has_performed_background_download_ = false;

  const WebState* web_state_ = nullptr;
  Delegate* delegate_ = nullptr;
  NSURLSession* session_ = nil;
  NSURLSessionTask* session_task_ = nil;

  // Observes UIApplicationWillResignActiveNotification notifications.
  id<NSObject> observer_ = nil;

  base::WeakPtrFactory<DownloadTaskImpl> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(DownloadTaskImpl);
};

}  // namespace web

#endif  // IOS_WEB_DOWNLOAD_DOWNLOAD_TASK_IMPL_H_
