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

#import "ios/crnet/CrNet.h"

#include "base/logging.h"
#include "base/strings/sys_string_conversions.h"
#import "ios/net/crn_http_protocol_handler.h"
#import "ios/crnet/crnet_environment.h"

static CrNetEnvironment* g_chrome_net = NULL;

static BOOL g_spdy_enabled = YES;
static BOOL g_quic_enabled = NO;
static BOOL g_sdch_enabled = NO;
static NSString* g_user_agent = nil;
static NSString* g_sdch_pref_store_filename = nil;
static double g_alternate_protocol_threshold = 1.0;
static RequestFilterBlock g_request_filter_block = nil;

@implementation CrNet

+ (void)setSpdyEnabled:(BOOL)spdyEnabled {
  g_spdy_enabled = spdyEnabled;
}

+ (void)setQuicEnabled:(BOOL)quicEnabled {
  g_quic_enabled = quicEnabled;
}

+ (void)setSDCHEnabled:(BOOL)sdchEnabled
         withPrefStore:(NSString*)filename {
  g_sdch_enabled = sdchEnabled;
  g_sdch_pref_store_filename = filename;
}

+ (void)setPartialUserAgent:(NSString *)userAgent {
  g_user_agent = userAgent;
}

+ (void)setAlternateProtocolThreshold:(double)alternateProtocolThreshold {
  g_alternate_protocol_threshold = alternateProtocolThreshold;
}

+ (void)installInternal {
  CrNetEnvironment::Initialize();
  std::string partial_user_agent = base::SysNSStringToUTF8(g_user_agent);
  g_chrome_net = new CrNetEnvironment(partial_user_agent);

  g_chrome_net->set_spdy_enabled(g_spdy_enabled);
  g_chrome_net->set_quic_enabled(g_quic_enabled);
  g_chrome_net->set_sdch_enabled(g_sdch_enabled);
  if (g_sdch_pref_store_filename) {
    std::string filename = base::SysNSStringToUTF8(g_sdch_pref_store_filename);
    g_chrome_net->set_sdch_pref_store_filename(filename);
  }
  g_chrome_net->set_alternate_protocol_threshold(
      g_alternate_protocol_threshold);

  g_chrome_net->Install();
  g_chrome_net->SetHTTPProtocolHandlerRegistered(true);
  g_chrome_net->SetRequestFilterBlock(g_request_filter_block);
}

+ (void)install {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
      [self installInternal];
  });
}

+ (void)installIntoSessionConfiguration:(NSURLSessionConfiguration*)config {
  g_chrome_net->InstallIntoSessionConfiguration(config);
}

+ (void)installWithPartialUserAgent:(NSString *)partialUserAgent {
  [self setPartialUserAgent:partialUserAgent];
  [self install];
}

+ (void)installWithPartialUserAgent:(NSString *)partialUserAgent
           enableDataReductionProxy:(BOOL)enableDataReductionProxy {
  LOG(ERROR) << "enableDataReductionProxy is no longer respected. The "
      << "functionality has been removed from CrNet.";

  [self setPartialUserAgent:partialUserAgent];
  [self install];
}

+ (void)installWithPartialUserAgent:(NSString *)partialUserAgent
             withRequestFilterBlock:(RequestFilterBlock)requestFilterBlock {
  [self setPartialUserAgent:partialUserAgent];
  [self setRequestFilterBlock:requestFilterBlock];
  [self install];
}

+ (void)setRequestFilterBlock:(RequestFilterBlock)block {
  if (g_chrome_net)
    g_chrome_net->SetRequestFilterBlock(block);
  else
    g_request_filter_block = block;
}

+ (void)uninstall {
  if (g_chrome_net) {
    g_chrome_net->SetHTTPProtocolHandlerRegistered(false);
  }
}

+ (void)startNetLogToFile:(NSString *)fileName logBytes:(BOOL)logBytes {
  if (g_chrome_net && [fileName length]) {
    g_chrome_net->StartNetLog([fileName UTF8String], logBytes);
  }
}

+ (void)stopNetLog {
  if (g_chrome_net) {
    return g_chrome_net->StopNetLog();
  }
}

+ (NSString *)userAgent {
  if (!g_chrome_net) {
    return nil;
  }

  std::string user_agent = g_chrome_net->user_agent();
  return [NSString stringWithCString:user_agent.c_str()
                            encoding:[NSString defaultCStringEncoding]];
}

+ (void)closeAllSpdySessions {
  if (g_chrome_net) {
    return g_chrome_net->CloseAllSpdySessions();
  }
}

+ (void)clearCacheWithCompletionCallback:(ClearCacheCallback)clearCacheCallback {
  if (g_chrome_net) {
    g_chrome_net->ClearCache(clearCacheCallback);
  }
}

@end
