<?php

namespace Stripe\StripeTaxForWooCommerce\SDK\lib;

/**
 * Class Stripe\StripeTaxForWooCommerce\SDK\lib.
 */
class Stripe {

	/** @var string The Stripe\StripeTaxForWooCommerce\SDK\lib API key to be used for requests. */
	public static $apiKey;

	/** @var string The Stripe\StripeTaxForWooCommerce\SDK\lib client_id to be used for Connect requests. */
	public static $clientId;

	/** @var string The base URL for the Stripe\StripeTaxForWooCommerce\SDK\lib API. */
	public static $apiBase = 'https://api.stripe.com';

	/** @var string The base URL for the OAuth API. */
	public static $connectBase = 'https://connect.stripe.com';

	/** @var string The base URL for the Stripe\StripeTaxForWooCommerce\SDK\lib API uploads endpoint. */
	public static $apiUploadBase = 'https://files.stripe.com';

	/** @var string The version of the Stripe\StripeTaxForWooCommerce\SDK\lib API to use for requests. */
	public static $apiVersion = \Stripe\StripeTaxForWooCommerce\SDK\lib\Util\ApiVersion::CURRENT;

	/** @var null|string The account ID for connected accounts requests. */
	public static $accountId = null;

	/** @var string Path to the CA bundle used to verify SSL certificates */
	public static $caBundlePath = null;

	/** @var bool Defaults to true. */
	public static $verifySslCerts = true;

	/** @var array The application's information (name, version, URL) */
	public static $appInfo = null;

	/**
	 * @var null|Util\LoggerInterface the logger to which the library will
	 *   produce messages
	 */
	public static $logger = null;

	/** @var int Maximum number of request retries */
	public static $maxNetworkRetries = 0;

	/** @var bool Whether client telemetry is enabled. Defaults to true. */
	public static $enableTelemetry = true;

	/** @var float Maximum delay between retries, in seconds */
	private static $maxNetworkRetryDelay = 2.0;

	/** @var float Maximum delay between retries, in seconds, that will be respected from the Stripe\StripeTaxForWooCommerce\SDK\lib API */
	private static $maxRetryAfter = 60.0;

	/** @var float Initial delay between retries, in seconds */
	private static $initialNetworkRetryDelay = 0.5;

	const VERSION = '13.8.0';

	/**
	 * @return string the API key used for requests
	 */
	public static function getApiKey() {
		return self::$apiKey;
	}

	/**
	 * @return string the client_id used for Connect requests
	 */
	public static function getClientId() {
		return self::$clientId;
	}

	/**
	 * @return Util\LoggerInterface the logger to which the library will
	 *   produce messages
	 */
	public static function getLogger() {
		if ( null === self::$logger ) {
			return new Util\DefaultLogger();
		}

		return self::$logger;
	}

	/**
	 * @param \Psr\Log\LoggerInterface|Util\LoggerInterface $logger the logger to which the library
	 *   will produce messages
	 */
	public static function setLogger( $logger ) {
		self::$logger = $logger;
	}

	/**
	 * Sets the API key to be used for requests.
	 *
	 * @param string $apiKey
	 */
	public static function setApiKey( $apiKey ) {
		self::$apiKey = $apiKey;
	}

	/**
	 * Sets the client_id to be used for Connect requests.
	 *
	 * @param string $clientId
	 */
	public static function setClientId( $clientId ) {
		self::$clientId = $clientId;
	}

	/**
	 * @return string the API version used for requests
	 */
	public static function getApiVersion() {
		return self::$apiVersion;
	}

	/**
	 * @param string $apiVersion the API version to use for requests
	 */
	public static function setApiVersion( $apiVersion ) {
		self::$apiVersion = $apiVersion;
	}

	/**
	 * @return string
	 */
	private static function getDefaultCABundlePath() {
		return \realpath( __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'ca-certificates.crt' );
	}

	/**
	 * @return string
	 */
	public static function getCABundlePath() {
		return self::$caBundlePath ?: self::getDefaultCABundlePath();
	}

	/**
	 * @param string $caBundlePath
	 */
	public static function setCABundlePath( $caBundlePath ) {
		self::$caBundlePath = $caBundlePath;
	}

	/**
	 * @return bool
	 */
	public static function getVerifySslCerts() {
		return self::$verifySslCerts;
	}

	/**
	 * @param bool $verify
	 */
	public static function setVerifySslCerts( $verify ) {
		self::$verifySslCerts = $verify;
	}

	/**
	 * @return null|string The Stripe\StripeTaxForWooCommerce\SDK\lib account ID for connected account
	 *   requests
	 */
	public static function getAccountId() {
		return self::$accountId;
	}

	/**
	 * @param null|string $accountId the Stripe\StripeTaxForWooCommerce\SDK\lib account ID to set for connected
	 *   account requests
	 */
	public static function setAccountId( $accountId ) {
		self::$accountId = $accountId;
	}

	/**
	 * @return null|array The application's information
	 */
	public static function getAppInfo() {
		return self::$appInfo;
	}

	/**
	 * @param string      $appName The application's name
	 * @param null|string $appVersion The application's version
	 * @param null|string $appUrl The application's URL
	 * @param null|string $appPartnerId The application's partner ID
	 */
	public static function setAppInfo( $appName, $appVersion = null, $appUrl = null, $appPartnerId = null ) {
		self::$appInfo               = self::$appInfo ?: array();
		self::$appInfo['name']       = $appName;
		self::$appInfo['partner_id'] = $appPartnerId;
		self::$appInfo['url']        = $appUrl;
		self::$appInfo['version']    = $appVersion;
	}

	/**
	 * @return int Maximum number of request retries
	 */
	public static function getMaxNetworkRetries() {
		return self::$maxNetworkRetries;
	}

	/**
	 * @param int $maxNetworkRetries Maximum number of request retries
	 */
	public static function setMaxNetworkRetries( $maxNetworkRetries ) {
		self::$maxNetworkRetries = $maxNetworkRetries;
	}

	/**
	 * @return float Maximum delay between retries, in seconds
	 */
	public static function getMaxNetworkRetryDelay() {
		return self::$maxNetworkRetryDelay;
	}

	/**
	 * @return float Maximum delay between retries, in seconds, that will be respected from the Stripe\StripeTaxForWooCommerce\SDK\lib API
	 */
	public static function getMaxRetryAfter() {
		return self::$maxRetryAfter;
	}

	/**
	 * @return float Initial delay between retries, in seconds
	 */
	public static function getInitialNetworkRetryDelay() {
		return self::$initialNetworkRetryDelay;
	}

	/**
	 * @return bool Whether client telemetry is enabled
	 */
	public static function getEnableTelemetry() {
		return self::$enableTelemetry;
	}

	/**
	 * @param bool $enableTelemetry Enables client telemetry.
	 *
	 * Client telemetry enables timing and request metrics to be sent back to Stripe\StripeTaxForWooCommerce\SDK\lib as an HTTP Header
	 * with the current request. This enables Stripe\StripeTaxForWooCommerce\SDK\lib to do latency and metrics analysis without adding extra
	 * overhead (such as extra network calls) on the client.
	 */
	public static function setEnableTelemetry( $enableTelemetry ) {
		self::$enableTelemetry = $enableTelemetry;
	}
}