"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 UnsupportedError_1 = require("../errors/UnsupportedError");
var execute_1 = require("../execute");
Promise = Promise || Bluebird;
/**
 * Returns information about an image.
 *
 * @param {string} filePath Path to the image file.
 * @returns {Bluebird<IInfoResult>}
 */
function info(filePath) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var numberOfFrames, args, _a, stdout, stderr, temp, result;
        return tslib_1.__generator(this, function (_b) {
            switch (_b.label) {
                case 0: return [4 /*yield*/, getNumberOfFrames(filePath)];
                case 1:
                    numberOfFrames = _b.sent();
                    args = ["-format", "%m %z %w %h %b %x %y %[orientation] %f"];
                    if (numberOfFrames > 1) {
                        args.push(filePath + "[0]");
                    }
                    else {
                        args.push(filePath);
                    }
                    return [4 /*yield*/, execute_1.execute("identify", args)];
                case 2:
                    _a = _b.sent(), stdout = _a.stdout, stderr = _a.stderr;
                    if (stdout === "") {
                        throw new UnsupportedError_1.UnsupportedError("ImageMagick returned unexpected data.");
                    }
                    temp = stdout
                        .replace(/PixelsPerInch/g, "")
                        .replace(/PixelsPerCentimeter/g, "")
                        .split(/\s+/g);
                    // All fields not found
                    if (temp.length < 8) {
                        throw new UnsupportedError_1.UnsupportedError("ImageMagick returned unexpected data.");
                    }
                    result = {
                        density: {
                            x: parseFloat(temp[5]),
                            y: parseFloat(temp[6])
                        },
                        depth: parseInt(temp[1], 10),
                        frames: numberOfFrames,
                        height: parseInt(temp[3], 10),
                        name: temp.slice(8).join(" ").replace(/(\r\n|\n|\r)/gm, "").trim(),
                        orientation: temp[7],
                        path: filePath,
                        size: parseSize(temp[4]),
                        type: temp[0].toLowerCase(),
                        width: parseInt(temp[2], 10)
                    };
                    if (stderr) {
                        result.warnings = stderr;
                    }
                    return [2 /*return*/, result];
            }
        });
    });
}
exports.info = info;
function getNumberOfFrames(filePath) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var args, _a, stdout, stderr;
        return tslib_1.__generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    args = ["-format", "%n\n", "" + filePath];
                    return [4 /*yield*/, execute_1.execute("identify", args)];
                case 1:
                    _a = _b.sent(), stdout = _a.stdout, stderr = _a.stderr;
                    if (stdout === "") {
                        throw new UnsupportedError_1.UnsupportedError("ImageMagick returned unexpected data.");
                    }
                    return [2 /*return*/, parseInt(stdout.split("\n")[0], 10)];
            }
        });
    });
}
var units = {
    B: 1,
    GB: 1000000000,
    KB: 1000,
    MB: 1000000,
    TB: 1000000000000
};
function parseSize(sizeString) {
    var rx = /^(\d*\.?\d*)([KMGT]?B)$/; // regex for extract the float value and its unit
    var sizeArray = rx.exec(sizeString);
    return parseFloat(sizeArray[1]) * units[sizeArray[2]];
}