public CyclocityCredentials WithContract(string @contract)
 {
     if (!IsContractValid(@contract))
         throw new System.ArgumentException();
     var _instance = new CyclocityCredentials(BaseUrl, ApiKey, @contract);
     return _instance;
 }
 public CyclocityCredentials WithApiKey(string @apiKey)
 {
     if (!IsApiKeyValid(@apiKey))
         throw new System.ArgumentException();
     var _instance = new CyclocityCredentials(BaseUrl, @apiKey, Contract);
     return _instance;
 }
 public CyclocityCredentials WithBaseUrl(string @baseUrl)
 {
     if (!IsBaseUrlValid(@baseUrl))
         throw new System.ArgumentException();
     var _instance = new CyclocityCredentials(@baseUrl, ApiKey, Contract);
     return _instance;
 }
 public static CyclocityCredentials Create(string @apiKey, string @contract)
 {
     if (!IsApiKeyValid(@apiKey))
         throw new System.ArgumentException();
     if (!IsContractValid(@contract))
         throw new System.ArgumentException();
     var _instance = new CyclocityCredentials(DefaultBaseUrl, @apiKey, @contract);
     return _instance;
 }
        public CyclocityCredentials WithContract(string @contract)
        {
            if (!IsContractValid(@contract))
            {
                throw new System.ArgumentException();
            }
            var _instance = new CyclocityCredentials(BaseUrl, ApiKey, @contract);

            return(_instance);
        }
        public CyclocityCredentials WithApiKey(string @apiKey)
        {
            if (!IsApiKeyValid(@apiKey))
            {
                throw new System.ArgumentException();
            }
            var _instance = new CyclocityCredentials(BaseUrl, @apiKey, Contract);

            return(_instance);
        }
        public CyclocityCredentials WithBaseUrl(string @baseUrl)
        {
            if (!IsBaseUrlValid(@baseUrl))
            {
                throw new System.ArgumentException();
            }
            var _instance = new CyclocityCredentials(@baseUrl, ApiKey, Contract);

            return(_instance);
        }
        public static CyclocityCredentials Create(string @apiKey, string @contract)
        {
            if (!IsApiKeyValid(@apiKey))
            {
                throw new System.ArgumentException();
            }
            if (!IsContractValid(@contract))
            {
                throw new System.ArgumentException();
            }
            var _instance = new CyclocityCredentials(DefaultBaseUrl, @apiKey, @contract);

            return(_instance);
        }
        public static IKernel CreateDefaultKernel(bool generateFakeData)
        {
            var _kernel = new StandardKernel();

            _kernel
            .Bind <CyclocityCredentials>()
            .ToMethod(_context => CyclocityCredentials.GetFromConfiguration())
            .InSingletonScope();

            _kernel
            .Bind <Random>()
            .ToSelf()
            .InSingletonScope();

            _kernel
            .Bind <ITaskulerWorker>()
            .ToMethod(_context => TaskulerWorker.Create())
            .InSingletonScope()
            .OnActivation((_context, _worker) =>
            {
                _worker.StartAsync();
            });

            if (generateFakeData)
            {
                var _fakeUpdateSchedule = TimeSpan.FromSeconds(10);
                _kernel
                .Bind <ITaskulerScheduleHandle>()
                .ToMethod(_context => _context.Kernel.Get <ITaskulerWorker>().AddIntervalSchedule(_fakeUpdateSchedule))
                .WhenInjectedInto <FakeStatusCyclocityRepository>()
                .InSingletonScope();

                _kernel
                .Bind <TimeSpan>()
                .ToConstant(_fakeUpdateSchedule)
                .WhenInjectedInto <FakeStatusCyclocityRepository.DefaultFakeGenerator>();

                _kernel
                .Bind <FakeStatusCyclocityRepository.IFakeGenerator>()
                .To <FakeStatusCyclocityRepository.DefaultFakeGenerator>()
                .InSingletonScope();

                _kernel
                .Bind <ICyclocityRepository>()
                .To <FakeStatusCyclocityRepository>()
                .InSingletonScope();

                _kernel
                .Bind <ICyclocityRepository>()
                .To <CyclocityRepository>()
                .WhenInjectedInto <FakeStatusCyclocityRepository>();
            }
            else
            {
                _kernel
                .Bind <ICyclocityRepository>()
                .To <CachingCyclocityRepository>()
                .InSingletonScope();

                _kernel
                .Bind <ICyclocityRepository>()
                .To <CyclocityRepository>()
                .WhenInjectedInto <CachingCyclocityRepository>();

                _kernel
                .Bind <CacheItemPolicy>()
                .ToMethod(_context => new CacheItemPolicy {
                    AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(30),
                })
                .WhenInjectedInto <CachingCyclocityRepository>();

                _kernel
                .Bind <ObjectCache>()
                .ToConstant(MemoryCache.Default)
                .WhenInjectedInto <CachingCyclocityRepository>();
            }

            _kernel
            .Bind <IMainRepository>()
            .To <MainRepository>();

            _kernel.Bind <ISubStartup>().To <Web.ClientAccessPolicy.Startup>();
            _kernel.Bind <ISubStartup>().To <Web.WebApi.Startup>();
            _kernel.Bind <ISubStartup>().To <Web.Readme.Startup>();

            return(_kernel);
        }