const STYLE_REGEX = /(\$(\d*)\(?)[^$|\[\],\s]*\)?/;
const STYLE_TRIGGER = () => TAC_CFG.useStyleVars && tagword.match(STYLE_REGEX);

var lastStyleVarIndex = "";

class StyleParser extends BaseTagParser {
   async parse() {
        // Refresh if needed
        await refreshStyleNamesIfChanged();

        // Show styles
        let tempResults = [];
        let matchGroups = tagword.match(STYLE_REGEX);
        
        // Save index to insert again later or clear last one
        lastStyleVarIndex = matchGroups[2] ? matchGroups[2] : "";

        if (tagword !== matchGroups[1]) {
            let searchTerm = tagword.replace(matchGroups[1], "");
            
            let filterCondition = x => {
                let regex = new RegExp(escapeRegExp(searchTerm, true), 'i');
                return regex.test(x[0].toLowerCase()) || regex.test(x[0].toLowerCase().replaceAll(" ", "_"));
            };
            tempResults = styleNames.filter(x => filterCondition(x)); // Filter by tagword
        } else {
            tempResults = styleNames;
        }

        // Add final results
        let finalResults = [];
        tempResults.forEach(t => {
            let result = new AutocompleteResult(t[0].trim(), ResultType.styleName)
            result.meta = "Style";
            finalResults.push(result);
        });

        return finalResults;
    }
}

async function load(force = false) {
    if (styleNames.length === 0 || force) {
        try {
            styleNames = (await loadCSV(`${tagBasePath}/temp/styles.txt`))
                .filter(x => x[0]?.trim().length > 0) // Remove empty lines
                .filter(x => x[0] !== "None") // Remove "None" style
                .map(x => [x[0].trim()]); // Trim name
        } catch (e) {
            console.error("Error loading styles.txt: " + e);
        }
    }
}

function sanitize(tagType, text) {
    if (tagType === ResultType.styleName) {
        if (text.includes(" ")) {
            return `$${lastStyleVarIndex}(${text})`;
        } else {
            return`$${lastStyleVarIndex}${text}`
        }
    }
    return null;
}

PARSERS.push(new StyleParser(STYLE_TRIGGER));

// Add our utility functions to their respective queues
QUEUE_FILE_LOAD.push(load);
QUEUE_SANITIZE.push(sanitize);
