package magic.utils

import std.regex.*
import std.collection.*

public func splitByMarkers(content: String, markers: Array<String>): Array<String> {
    if (markers.isEmpty()) {
        return [content]
    }
    let re = Regex(String.join(markers |> map({marker => escape(marker)})|> collectArray, delimiter: "|"))
    let matches = re.matcher(content).findAll() ?? Array<MatchData>()
    let splits = ArrayList<String>()
    var index = 0
    for (md in matches) {
        let position = md.matchPosition()
        splits.append(content[index..position.start])
        index = position.end
    }
    let lastSplit = content[index..content.size]
    if (lastSplit.size > 0) {
        splits.append(lastSplit)
    }
    splits.toArray()
}

public func escape(input: String): String {
    var specialCharacters = ##"[\.\^\$\|\?\*\+\(\)\[\]\{\}]"##
    var regex = Regex(specialCharacters)
    var matcher = regex.matcher(input)
    let matchDatas = matcher.findAll().getOrDefault({=> Array<MatchData>()})
    var output = ArrayList<Byte>(input.toArray())
    for (i in matchDatas.size - 1..=0 : -1) {
        var matchData = matchDatas[i]
        var matchStr = matchData.matchStr()
        output.insert(matchData.matchPosition().start, b'\\')
    }
    return String.fromUtf8(output.toArray())
}

public func regSearch(content:String, pattern:String, group!:Int64 = 0): Option<String> {
    var re = Regex(pattern)
    match (re.matches(content)) {
        case Some(r) => r.matchStr(group)
        case None => None
    }
}