/*
    From https://github.com/DiegoZoracKy/image-data-uri/blob/master/lib/image-data-uri.js
    Modified with 0 dependencies
 */
let fs = require("fs");

let ImageDataURI = (() => {

    /**
     * @param {string} dataURI - A string that is a valid Data URI.
     * @returns {?Object} An object with properties "imageType" and "dataBase64". The former is the image type, e.g., "png", and the latter is a base64 encoded string of the image's binary data. If it fails to parse, returns null instead of an object.
     *
     * Generated by Trelent
     */
    function decode(dataURI) {
        if (!/data:image\//.test(dataURI)) {
            console.log("ImageDataURI :: Error :: It seems that it is not an Image Data URI. Couldn't match \"data:image/\"");
            return null;
        }

        let regExMatches = dataURI.match("data:(image/.*);base64,(.*)");
        return {
            imageType: regExMatches[1],
            dataBase64: regExMatches[2],
            dataBuffer: new Buffer(regExMatches[2], "base64")
        };
    }

    /**
     * @param {Buffer} data - The image data to be encoded.
     * @param {String} mediaType - The type of the image, e.g., "image/png".
     * @returns {String|null} A string representing the base64-encoded version of the given Buffer object or null if an error occurred.
     *
     * Generated by Trelent
     */
    function encode(data, mediaType) {
        if (!data || !mediaType) {
            console.log("ImageDataURI :: Error :: Missing some of the required params: data, mediaType ");
            return null;
        }

        mediaType = (/\//.test(mediaType)) ? mediaType : "image/" + mediaType;
        let dataBase64 = (Buffer.isBuffer(data)) ? data.toString("base64") : new Buffer(data).toString("base64");
        let dataImgBase64 = "data:" + mediaType + ";base64," + dataBase64;

        return dataImgBase64;
    }

    /**
     * Converts a data URI to a file path.
     * @param {string} dataURI The Data URI of the image.
     * @param {string} [filePath] The path where the image will be saved, defaults to "./".
     *
     * Generated by Trelent
     */
    function outputFile(dataURI, filePath) {
        filePath = filePath || "./";
        return new Promise((resolve, reject) => {
            let imageDecoded = decode(dataURI);

            fs.writeFile(filePath, imageDecoded.dataBuffer, err => {
                if (err) {
                    return reject("ImageDataURI :: Error :: " + JSON.stringify(err, null, 4));
                }
                resolve(filePath);
            });
        });
    }

    return {
        decode: decode,
        encode: encode,
        outputFile: outputFile,
    };
})();

module.exports = ImageDataURI;