// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {InlineStrategy} from '../pluginStrategy'
import findRangesWithRegex from '../utils/findRangesWithRegex'

// Bold can be delimited by: **, __, ***, and ___
const createBoldStyleStrategy = (): InlineStrategy => {
    const asteriskDelimitedRegex =
		'(\\*\\*\\*)(.+?)(\\*\\*\\*)|(\\*\\*)(.+?)(\\*\\*)(?!\\*)'
    const underscoreDelimitedRegex = '(___)(.+?)(___)|(__)(.+?)(__)(?!_)'
    const boldRegex = new RegExp(
        `${asteriskDelimitedRegex}|${underscoreDelimitedRegex}`,
        'g',
    )
    const boldDelimiterRegex = /^(\*\*\*|\*\*|___|__)|(\*\*\*|\*\*|___|__)$/g

    return {
        style: 'BOLD',
        delimiterStyle: 'BOLD-DELIMITER',
        findStyleRanges: (block) => {
            // Return an array of arrays containing start and end indices for ranges of
            // text that should be bolded
            // e.g. [[0,6], [10,20]]
            const text = block.getText()
            const boldRanges = findRangesWithRegex(text, boldRegex)
            return boldRanges
        },
        findDelimiterRanges: (block, styleRanges) => {
            // Find ranges for delimiters at the beginning/end of styled text ranges
            // Returns an array of arrays containing start and end indices for delimiters
            const text = block.getText()
            let boldDelimiterRanges: number[][] = []
            styleRanges.forEach((styleRange) => {
                const delimiterRange = findRangesWithRegex(
                    text.substring(styleRange[0], styleRange[1] + 1),
                    boldDelimiterRegex,
                ).map((indices) => indices.map((x) => x + styleRange[0]))
                boldDelimiterRanges = boldDelimiterRanges.concat(delimiterRange)
            })
            return boldDelimiterRanges
        },
        delimiterStyles: {
            opacity: 0.4,
        },
    }
}

export default createBoldStyleStrategy
