'use strict';

const replacements = {

    /* search filter replacements */

    filter: {
        '\u0000': '\\00', // NUL
        '\u0028': '\\28', // (
        '\u0029': '\\29', // )
        '\u002a': '\\2a', // *
        '\u005c': '\\5c'  // \
    },

    /* distinguished name replacements */

    dnBegin: {
        '\u0020': '\\ ', // SPC
    },
    dn: {
        '\u0022': '\\"', // "
        '\u0023': '\\#', // #
        '\u002b': '\\+', // +
        '\u002c': '\\,', // ,
        '\u003b': '\\;', // ;
        '\u003c': '\\<', // <
        '\u003d': '\\=', // =
        '\u003e': '\\>', // >
        '\u005c': '\\\\' // \
    },
    dnEnd: {
        '\u0020': '\\ ' // SPC
    }

};

module.exports = {

    filter: function filter(strings, ...values) {
        let safe = '';
        strings.forEach((string, i) => {
            safe += string;
            if (values.length > i) {
                safe += `${values[i]}`.replace(/(\u0000|\u0028|\u0029|\u002a|\u005c)/gm, (ch) => replacements.filter[ch]);
            }
        });
        return safe;
    },

    dn: function dn(strings, ...values) {
        let safe = '';
        strings.forEach((string, i) => {
            safe += string;
            if (values.length > i) {
                safe += `${values[i]}`
                    .replace(/(\u0022|\u0023|\u002b|\u002c|\u003b|\u003c|\u003d|\u003e|\u005c)/gm, (ch) => replacements.dn[ch])
                    .replace(/^(\u0020)/gm, (ch) => replacements.dnBegin[ch])
                    .replace(/(\u0020)$/gm, (ch) => replacements.dnEnd[ch]);

            }
        });
        return safe;
    },


};