import Base64 from "./base64";

//網址使用base64的方案  By Leeson_Hsu
export default class Base64Url {
    constructor() {

    }  
     /**
     * 傳入並轉為BASE64字串
     * @param {*} sourceString 來源字串
     */
    static encodeUrlBase64(sourceString) {
        //使用暫時的變數來取代代入值,避免之後被覆寫
        var base64String = "" + Base64.encode(JsonString);
        console.log("replace!!");
        //base64在URL會有下列三種符號會有問題
        var replacements = {
            "+": "."
            , "=": "-"
            , "/": "_"
        };
        //必須使用正則覆蓋,多重replace會有異常沒覆蓋的問題
        var finalString = Base64Url.replace(base64String, replacements);
        return  finalString;
    }

    /**
     * 傳入一個BASE64字串,並將其解開
     * @param {*} base64String 
     */
    static decodeUrlBase64(base64String) {
        //使用暫時的變數來取代代入值,避免之後被覆寫
        var tmpString = "" + decodeURIComponent(base64String);
        //base64在URL會有下列三種符號會有問題
        var replacements = {
            ".": "+"
            , "-": "="
            , "_": "/"
        };
        //必須使用正則覆蓋,多重replace會有異常沒覆蓋的問題
        var finalBase64 = Base64Url.replace(tmpString, replacements);
        return Base64.decode(finalBase64);
    }
   
    /**
    * 使用正則覆蓋,否則原始多重replace會造成解析過慢來不及覆蓋的問題
    * @param {*} SourceString 
    * @param {*} replacements 
    * 
    *  var replacements = {
           "a": "d"
           , "b": "e"
           , "c": "f"
       };
    */
    static replace(SourceString, replacements) {
        Array.prototype.each = function (trans) {
            for (var i = 0; i < this.length; i++)
                this[i] = trans(this[i], i, this);
            return this;
        };
        Array.prototype.map = function (trans) {
            return [].concat(this).each(trans);
        };
        RegExp.escape = function (str) {
            return new String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
        };
        function properties(obj) {
            var props = [];
            for (var p in obj) props.push(p);
            return props;
        }
        var regex = new RegExp(properties(replacements).map(RegExp.escape).join("|"), "g");
        SourceString = SourceString.replace(regex, function ($0) { return replacements[$0]; });
        return SourceString;
    }
}