/*---------------------------------------------------------
 * Copyright (C) Microsoft Corporation. All rights reserved.
 *--------------------------------------------------------*/
/// <reference path="../declares.d.ts" />
'use strict';
define(["require", "exports", 'monaco', 'https'], function (require, exports, monaco, https) {
    function tagsForImage(image) {
        var tags = [];
        if (image.is_automated) {
            tags.push('Automated');
        }
        else if (image.is_trusted) {
            tags.push('Trusted');
        }
        else if (image.is_official) {
            tags.push('Official');
        }
        if (tags.length > 0) {
            return '[' + tags.join('] [') + ']';
        }
        return '';
    }
    exports.tagsForImage = tagsForImage;
    function searchImageInRegistryHub(imageName, cache) {
        return invokeHubSearch(imageName, 1, cache).then(function (data) {
            if (data.results.length === 0) {
                return null;
            }
            return data.results[0];
        });
    }
    exports.searchImageInRegistryHub = searchImageInRegistryHub;
    var popular = [
        { "is_automated": false, "name": "redis", "is_trusted": false, "is_official": true, "star_count": 831, "description": "Redis is an open source key-value store that functions as a data structure server." },
        { "is_automated": false, "name": "ubuntu", "is_trusted": false, "is_official": true, "star_count": 1827, "description": "Ubuntu is a Debian-based Linux operating system based on free software." },
        { "is_automated": false, "name": "wordpress", "is_trusted": false, "is_official": true, "star_count": 350, "description": "The WordPress rich content management system can utilize plugins, widgets, and themes." },
        { "is_automated": false, "name": "mysql", "is_trusted": false, "is_official": true, "star_count": 767, "description": "MySQL is a widely used, open-source relational database management system (RDBMS)." },
        { "is_automated": false, "name": "mongo", "is_trusted": false, "is_official": true, "star_count": 683, "description": "MongoDB document databases provide high availability and easy scalability." },
        { "is_automated": false, "name": "centos", "is_trusted": false, "is_official": true, "star_count": 1066, "description": "The official build of CentOS." },
        { "is_automated": false, "name": "node", "is_trusted": false, "is_official": true, "star_count": 787, "description": "Node.js is a JavaScript-based platform for server-side and networking applications." },
        { "is_automated": false, "name": "nginx", "is_trusted": false, "is_official": true, "star_count": 993, "description": "Official build of Nginx." },
        { "is_automated": false, "name": "postgres", "is_trusted": false, "is_official": true, "star_count": 778, "description": "The PostgreSQL object-relational database system provides reliability and data integrity." },
        { "is_automated": true, "name": "microsoft/aspnet", "is_trusted": true, "is_official": false, "star_count": 186, "description": "ASP.NET is an open source server-side Web application framework" }
    ];
    function searchImagesInRegistryHub(prefix, cache) {
        if (prefix.length === 0) {
            return monaco.Promise.as(popular.slice(0));
        }
        return invokeHubSearch(prefix, 100, cache).then(function (data) {
            return data.results;
        });
    }
    exports.searchImagesInRegistryHub = searchImagesInRegistryHub;
    // https://registry.hub.docker.com/v1/search?q=redis&n=1
    // {
    //     "num_pages": 10,
    //     "num_results": 10,
    //     "results": [
    //         {
    //             "is_automated": false,
    //             "name": "redis",
    //             "is_trusted": false,
    //             "is_official": true,
    //             "star_count": 830,
    //             "description": "Redis is an open source key-value store that functions as a data structure server."
    //         }
    //     ],
    //     "page_size": 1,
    //     "query": "redis",
    //     "page": 1
    // }
    function invokeHubSearch(imageName, count, cache) {
        // https://registry.hub.docker.com/v1/search?q=redis&n=1
        return fetchHttpsJson({
            hostname: 'registry.hub.docker.com',
            port: 443,
            path: '/v1/search?q=' + encodeURIComponent(imageName) + '&n=' + count,
            method: 'GET',
        }, cache);
    }
    var JSON_CACHE = {};
    function fetchHttpsJson(opts, cache) {
        if (!cache) {
            return doFetchHttpsJson(opts);
        }
        var cache_key = (opts.method + ' ' + opts.hostname + ' ' + opts.path);
        if (!JSON_CACHE[cache_key]) {
            JSON_CACHE[cache_key] = doFetchHttpsJson(opts);
        }
        // new promise to avoid cancelling
        return new monaco.Promise(function (c, e, p) {
            JSON_CACHE[cache_key].then(c, e, p);
        }, function () {
            // no cancelling
        });
    }
    function doFetchHttpsJson(opts) {
        opts.headers = opts.headers || {};
        opts.headers['Accept'] = 'application/json';
        return httpsRequestAsPromise(opts).then(function (data) {
            return JSON.parse(data);
        });
    }
    function httpsRequestAsPromise(opts) {
        return new monaco.Promise(function (c, e, p) {
            var req = https.request(opts, function (res) {
                var data = '';
                res.on('data', function (d) {
                    data += d;
                });
                res.on('end', function () {
                    c(data);
                });
            });
            req.end();
            req.on('error', e);
        });
    }
});
