text: 'use strict';
  var _ = require('underscore');
  var nconf = require('nconf');
  
  var file = require('./file');
  
  const DEFAULT_CONFIG = {
    // usually you don't wanna change those
    sys: {
      categories: [
        'algorithms',
        'database',
        'shell',
        'concurrency'
      ],
      langs: [
        'bash',
        'c',
        'cpp',
        'csharp',
        'golang',
        'java',
        'javascript',
        'kotlin',
        'mysql',
        'php',
        'python',
        'python3',
        'ruby',
        'rust',
        'scala',
        'swift',
        'typescript'
      ],
      urls: {
        // base urls
        base:                      'https://leetcode.com',
        graphql:                   'https://leetcode.com/graphql',
        login:                     'https://leetcode.com/accounts/login/',
        // third part login base urls. TODO facebook google
        github_login:              'https://leetcode.com/accounts/github/login/?next=%2F',
        facebook_login:            'https://leetcode.com/accounts/facebook/login/?next=%2F',
        linkedin_login:            'https://leetcode.com/accounts/linkedin_oauth2/login/?next=%2F',
        // redirect urls
        leetcode_redirect:         'https://leetcode.com/',
        github_tf_redirect:        'https://github.com/sessions/two-factor',
        // simulate login urls
        github_login_request:      'https://github.com/login',
        github_session_request:    'https://github.com/session',
        github_tf_session_request: 'https://github.com/sessions/two-factor',
        linkedin_login_request:    'https://www.linkedin.com/login',
        linkedin_session_request:  'https://www.linkedin.com/checkpoint/lg/login-submit',
        // questions urls
        problems:                  'https://leetcode.com/api/problems/$category/',
        problem:                   'https://leetcode.com/problems/$slug/description/',
        test:                      'https://leetcode.com/problems/$slug/interpret_solution/',
        session:                   'https://leetcode.com/session/',
        submit:                    'https://leetcode.com/problems/$slug/submit/',
        submissions:               'https://leetcode.com/api/submissions/$slug',
        submission:                'https://leetcode.com/submissions/detail/$id/',
        verify:                    'https://leetcode.com/submissions/detail/$id/check/',
        favorites:                 'https://leetcode.com/list/api/questions',
        favorite_delete:           'https://leetcode.com/list/api/questions/$hash/$id',
        plugin:                    'https://raw.githubusercontent.com/leetcode-tools/leetcode-cli-plugins/master/plugins/$name.js'
      },
    },
  
    // but you will want change these
    autologin: {
      enable: false,
      retry:  2
    },
    code: {
      editor: 'vim',
      lang:   'cpp'
    },
    file: {
      show:       '${fid}.${slug}',
      submission: '${fid}.${slug}.${sid}.${ac}'
    },
    color: {
      enable: true,
      theme:  'default'
    },
    icon: {
      theme: ''
    },
    network: {
      concurrency: 10,
      delay:       1
    },
    plugins: {}
  };
  
  function Config() {}
  
  Config.prototype.init = function() {
    nconf.file('local', file.configFile())
        .add('global', {type: 'literal', store: DEFAULT_CONFIG})
        .defaults({});
  
    const cfg = nconf.get();
    nconf.remove('local');
    nconf.remove('global');
  
    // HACK: remove old style configs
    for (const x in cfg) {
      if (x === x.toUpperCase()) delete cfg[x];
    }
    delete DEFAULT_CONFIG.type;
    delete cfg.type;
  
    _.extendOwn(this, cfg);
  };
  
  Config.prototype.getAll = function(useronly) {
    const cfg = _.extendOwn({}, this);
    if (useronly) delete cfg.sys;
    return cfg;
  };
  
  module.exports = new Config();
  