import { charCodeOfDot, reEscapeChar, rePropName } from "../basic/_global";
import trimString from "./_trimString";

/**
 * Converts `string` to a property path array.
 *
 * @private
 * @param {string} string The string to convert.
 * @returns {Array} Returns the property path array.
 */
function stringToPath(string: string): Array<string> {
    const result: Array<string> = [];
    if (string.charCodeAt(0) === charCodeOfDot) {
        result.push("");
    }
    string.replace(rePropName, (match, expression, quote, subString) => {
        let key = match;
        if (quote) {
            key = subString.replace(reEscapeChar, "$1");
        } else if (expression) {
            key = trimString(expression);
        }
        result.push(key);
    });
    return result;
}

export default stringToPath;
// import memoizeCapped from "./memoizeCapped.js";

// const charCodeOfDot = ".".charCodeAt(0);
// const reEscapeChar = /\\(\\)?/g;
// const rePropName = RegExp(
//     // Match anything that isn't a dot or bracket.
//     "[^.[\\]]+" +
//         "|" +
//         // Or match property names within brackets.
//         "\\[(?:" +
//         // Match a non-string expression.
//         "([^\"'][^[]*)" +
//         "|" +
//         // Or match strings (supports escaping characters).
//         "([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2" +
//         ")\\]" +
//         "|" +
//         // Or match "" as the space between consecutive dots or empty brackets.
//         "(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))",
//     "g"
// );

// /**
//  * Converts `string` to a property path array.
//  *
//  * @private
//  * @param {string} string The string to convert.
//  * @returns {Array} Returns the property path array.
//  */
// const stringToPath = memoizeCapped(string => {
//     const result = [];
//     if (string.charCodeAt(0) === charCodeOfDot) {
//         result.push("");
//     }
//     string.replace(rePropName, (match, expression, quote, subString) => {
//         let key = match;
//         if (quote) {
//             key = subString.replace(reEscapeChar, "$1");
//         } else if (expression) {
//             key = expression.trim();
//         }
//         result.push(key);
//     });
//     return result;
// });

// export default stringToPath;
