var parseUrl = require('url').parse;
var request = require('request');
var createError = require('./util/createError');

function register(name, url, callback) {
    var config = this._config;
    var requestUrl = config.registry.register + '/packages';
    var remote = parseUrl(requestUrl);
    var headers = {};

    if (config.userAgent) {
        headers['User-Agent'] = config.userAgent;
    }

    if (config.accessToken) {
        requestUrl += '?access_token=' + config.accessToken;
    }

    request.post(
        {
            url: requestUrl,
            headers: headers,
            ca: config.ca.register,
            strictSSL: config.strictSsl,
            timeout: config.timeout,
            json: true,
            form: {
                name: name,
                url: url
            }
        },
        function(err, response) {
            // If there was an internal error (e.g. timeout)
            if (err) {
                return callback(
                    createError(
                        'Request to ' + requestUrl + ' failed: ' + err.message,
                        err.code
                    )
                );
            }

            // Duplicate
            if (response.statusCode === 403) {
                return callback(createError('Duplicate package', 'EDUPLICATE'));
            }

            // Invalid format
            if (response.statusCode === 400) {
                return callback(
                    createError('Invalid URL format', 'EINVFORMAT')
                );
            }

            // Everything other than 201 is unknown
            if (response.statusCode !== 201) {
                return callback(
                    createError(
                        'Unknown error: ' +
                            response.statusCode +
                            ' - ' +
                            response.body,
                        'EUNKNOWN'
                    )
                );
            }

            callback(null, {
                name: name,
                url: url
            });
        }
    );
}

module.exports = register;
