//
//  ActiveLabel.swift
//  Mastodon
//
//  Created by sxiaojian on 2021/1/29.
//

import UIKit
import Foundation
import ActiveLabel
import os.log

extension ActiveLabel {
    
    enum Style {
        case `default`
        case statusHeader
        case statusName
        case profileField
    }
    
    convenience init(style: Style) {
        self.init()
    
        numberOfLines = 0
        lineSpacing = 5
        mentionColor = Asset.Colors.Label.highlight.color
        hashtagColor = Asset.Colors.Label.highlight.color
        URLColor = Asset.Colors.Label.highlight.color
        emojiPlaceholderColor = .systemFill
        #if DEBUG
        text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
        #endif
        
        switch style {
        case .default:
            font = .preferredFont(forTextStyle: .body)
            textColor = Asset.Colors.Label.primary.color
        case .statusHeader:
            font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .medium), maximumPointSize: 17)
            textColor = Asset.Colors.Label.secondary.color
            numberOfLines = 1
        case .statusName:
            font = .systemFont(ofSize: 17, weight: .semibold)
            textColor = Asset.Colors.Label.primary.color
            numberOfLines = 1
        case .profileField:
            font = .preferredFont(forTextStyle: .body)
            textColor = Asset.Colors.Label.primary.color
            numberOfLines = 1
        }
    }
    
}

extension ActiveLabel {
    /// status content
    func configure(content: String, emojiDict: MastodonStatusContent.EmojiDict) {
        activeEntities.removeAll()
        
        if let parseResult = try? MastodonStatusContent.parse(content: content, emojiDict: emojiDict) {
            text = parseResult.trimmed
            activeEntities = parseResult.activeEntities
        } else {
            text = ""
        }
    }
    
    /// account note
    func configure(note: String, emojiDict: MastodonStatusContent.EmojiDict) {
        configure(content: note, emojiDict: emojiDict)
    }
}

extension ActiveLabel {
    /// account field
    func configure(field: String) {
        activeEntities.removeAll()
        let parseResult = MastodonField.parse(field: field)
        text = parseResult.value
        activeEntities = parseResult.activeEntities
    }
}