// Copyright (c) 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_NET_COOKIES_NS_HTTP_SYSTEM_COOKIE_STORE_H_
#define IOS_NET_COOKIES_NS_HTTP_SYSTEM_COOKIE_STORE_H_

#import <Foundation/Foundation.h>

#import "ios/net/cookies/system_cookie_store.h"

namespace net {

// This class is an implementation of SystemCookieStore, NSHTTPSystemCookieStore
// uses NSHTTPCookieStorage as the underlying system cookie store.
class NSHTTPSystemCookieStore : public net::SystemCookieStore {
 public:
  // By default the underlying cookiestore is
  // |NSHTTPCookieStorage sharedHTTPCookieStorage|
  NSHTTPSystemCookieStore();

  explicit NSHTTPSystemCookieStore(NSHTTPCookieStorage* cookie_store);

  ~NSHTTPSystemCookieStore() override;

  // Gets cookies for URL and calls |callback| async on these cookies.
  void GetCookiesForURLAsync(const GURL& url,
                             SystemCookieCallbackForCookies callback) override;

  // Gets all cookies and calls |callback| async on these cookies.
  void GetAllCookiesAsync(SystemCookieCallbackForCookies callback) override;

  // Deletes specific cookie and calls |callback| async after that.
  void DeleteCookieAsync(NSHTTPCookie* cookie,
                         SystemCookieCallback callback) override;

  // Sets cookie, and calls |callback| async after that.
  void SetCookieAsync(NSHTTPCookie* cookie,
                      const base::Time* optional_creation_time,
                      SystemCookieCallback callback) override;

  // Clears all cookies from the store and call |callback| after all cookies are
  // deleted.
  void ClearStoreAsync(SystemCookieCallback callback) override;

  NSHTTPCookieAcceptPolicy GetCookieAcceptPolicy() override;

 private:
  // Returns all cookies for a specific |url| from the internal cookie store.
  // Cookies are sorted, as per RFC6265.
  NSArray* GetCookiesForURL(const GURL& url);

  // Returns all cookies from the internal http cookie store.
  // Cookies are sorted, as per RFC6265.
  NSArray* GetAllCookies();

  // Deletes a specific cookie from the internal http cookie store.
  void DeleteCookie(NSHTTPCookie* cookie);

  // Sets a specific cookie to the internal http cookie store.
  // if the |optional_creation_time| is nullptr, uses Time::Now() as the
  // creation time.
  void SetCookie(NSHTTPCookie* cookie,
                 const base::Time* optional_creation_time);

  // Clears all cookies from the internal cookie store.
  void ClearStore();

  NSHTTPCookieStorage* cookie_store_;

  DISALLOW_COPY_AND_ASSIGN(NSHTTPSystemCookieStore);
};

}  // namespace net

#endif  // IOS_NET_COOKIES_NS_HTTP_SYSTEM_COOKIE_STORE_H_
