"use strict";
/*
 EasyImage

 EasyImage is a promise-based image processing module
 for Node.js, it is built on top of ImageMagick, so
 make sure ImageMagick is installed on your system.

 Copyright (c) 2015 Hage Yaapa <http://www.hacksparrow.com>
 Maintained by Kevin Gravier <http://github.com/mrkmg>

 MIT License
 */
exports.__esModule = true;
var tslib_1 = require("tslib");
var Bluebird = require("bluebird");
var execute_1 = require("../execute");
var utilities_1 = require("../utilities");
var info_1 = require("./info");
Promise = Promise || Bluebird;
/**
 * Creates a thumbnail of an image.
 *
 * @param {IThumbnailOptions} options
 * @returns {Bluebird<IInfoResult>}
 */
function thumbnail(options) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var infoData, args;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    utilities_1.applyDefaultsToBaseOptions(options);
                    return [4 /*yield*/, applyDefaultsToThumbnailOptions(options)];
                case 1:
                    _a.sent();
                    utilities_1.checkForMissingOptions(options, ["src", "width", "height"]);
                    return [4 /*yield*/, utilities_1.ensureDestinationDirectoryExists(options)];
                case 2:
                    _a.sent();
                    return [4 /*yield*/, info_1.info(options.src)];
                case 3:
                    infoData = _a.sent();
                    args = [options.src];
                    utilities_1.applyBaseOptionsToArgs(options, args);
                    if (options.gravity) {
                        args.push("-gravity", options.gravity);
                    }
                    args.push("-interpolate", options.interpolate);
                    args.push("-strip");
                    if (infoData.width > infoData.height) {
                        args.push("-thumbnail", "x" + options.height);
                    }
                    else {
                        args.push("-thumbnail", options.width + "x");
                    }
                    args.push("-crop", options.width + "x" + options.height + "+" + options.x + "+" + options.y);
                    args.push(options.dst);
                    return [4 /*yield*/, execute_1.execute("convert", args)];
                case 4:
                    _a.sent();
                    return [2 /*return*/, info_1.info(options.dst)];
            }
        });
    });
}
exports.thumbnail = thumbnail;
function applyDefaultsToThumbnailOptions(options) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var availableVersion;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    if (!options.x) {
                        options.x = 0;
                    }
                    if (!options.y) {
                        options.y = 0;
                    }
                    if (!!options.interpolate) return [3 /*break*/, 2];
                    return [4 /*yield*/, execute_1.getImageMagickVersion()];
                case 1:
                    availableVersion = _a.sent();
                    switch (availableVersion) {
                        case 6:
                            options.interpolate = "bicubic";
                            break;
                        case 7:
                            options.interpolate = "catrom";
                            break;
                    }
                    _a.label = 2;
                case 2: return [2 /*return*/];
            }
        });
    });
}