// Copyright © 2020 Metabolist. All rights reserved.

import Mastodon
import UIKit

extension String {
    static var separator: Self {
        (Locale.autoupdatingCurrent.groupingSeparator ?? ",").appending(" ")
    }

    func height(width: CGFloat, font: UIFont) -> CGFloat {
        (self as NSString).boundingRect(
            with: CGSize(width: width, height: .greatestFiniteMagnitude),
            options: .usesLineFragmentOrigin,
            attributes: [.font: font],
            context: nil)
            .height
    }

    func countEmphasizedAttributedString(count: Int, highlighted: Bool = false) -> NSAttributedString {
        let countRange = (self as NSString).range(of: String.localizedStringWithFormat("%ld", count))

        let attributed = NSMutableAttributedString(
            string: self,
            attributes: [
                .font: UIFont.preferredFont(forTextStyle: .body),
                .foregroundColor: highlighted ? UIColor.tertiaryLabel : UIColor.secondaryLabel
        ])
        attributed.addAttributes(
            [
                .font: UIFont.preferredFont(forTextStyle: .headline),
                .foregroundColor: highlighted ? UIColor.secondaryLabel : UIColor.label
            ],
            range: countRange)

        return attributed
    }

    func localizedBolding(displayName: String, emojis: [Emoji], label: UILabel) -> NSAttributedString {
        let mutableString = NSMutableAttributedString(
            string: String.localizedStringWithFormat(
                NSLocalizedString(self, comment: ""),
                displayName))

        let range = (mutableString.string as NSString).range(of: displayName)

        if range.location != NSNotFound,
           let boldFontDescriptor = label.font.fontDescriptor.withSymbolicTraits([.traitBold]) {
            let boldFont = UIFont(descriptor: boldFontDescriptor, size: label.font.pointSize)

            mutableString.setAttributes([NSAttributedString.Key.font: boldFont], range: range)
        }

        mutableString.insert(emojis: emojis, view: label)
        mutableString.resizeAttachments(toLineHeight: label.font.lineHeight)

        return mutableString
    }

    func appendingWithSeparator(_ string: Self) -> Self {
        appending(Self.separator).appending(string)
    }

    mutating func appendWithSeparator(_ string: Self) {
        append(Self.separator.appending(string))
    }
}
