//
//  CharacterCounter.swift
//  ComposeUI
//
//  Created by Shadowfacts on 9/29/18.
//  Copyright © 2018 Shadowfacts. All rights reserved.
//

import Foundation
import InstanceFeatures

public struct CharacterCounter {
    
    private static let linkDetector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    private static let mention = try! NSRegularExpression(pattern: "(@[a-z0-9_]+)(?:@[a-z0-9\\-\\.]+[a-z0-9]+)?", options: .caseInsensitive)
    
    public static func count(text: String, for instanceFeatures: InstanceFeatures) -> Int {
        let mentionsRemoved = removeMentions(in: text)
        var count = mentionsRemoved.count
        for match in linkDetector.matches(in: mentionsRemoved, options: [], range: NSRange(location: 0, length: mentionsRemoved.utf16.count)) {
            count -= match.range.length
            count += instanceFeatures.charsReservedPerURL
        }
        return count
    }
    
    private static func removeMentions(in text: String) -> String {
        var mut = text
        for match in mention.matches(in: mut, options: [], range: NSRange(location: 0, length: mut.utf16.count)).reversed() {
            let replacement = mut[Range(match.range(at: 1), in: mut)!]
            mut.replaceSubrange(Range(match.range, in: mut)!, with: replacement)
        }
        return mut
    }
    
}
