//
//  MastodonServerRulesViewModel.swift
//  Mastodon
//
//  Created by MainasuK Cirno on 2021-2-22.
//

import UIKit
import Combine
import MastodonSDK

final class MastodonServerRulesViewModel {
    
    // input
    let domain: String
    let authenticateInfo: AuthenticationViewModel.AuthenticateInfo
    let rules: [Mastodon.Entity.Instance.Rule]
    let instance: Mastodon.Entity.Instance
    let applicationToken: Mastodon.Entity.Token
    
    init(
        domain: String,
        authenticateInfo: AuthenticationViewModel.AuthenticateInfo,
        rules: [Mastodon.Entity.Instance.Rule],
        instance: Mastodon.Entity.Instance,
        applicationToken: Mastodon.Entity.Token
    ) {
        self.domain = domain
        self.authenticateInfo = authenticateInfo
        self.rules = rules
        self.instance = instance
        self.applicationToken = applicationToken
    }
    
    var rulesAttributedString: NSAttributedString {
        let attributedString = NSMutableAttributedString(string: "\n")
        let configuration = UIImage.SymbolConfiguration(font: .preferredFont(forTextStyle: .title3))
        let separatorString = Array(repeating: " ", count: 4).joined()
        for (i, rule) in rules.enumerated() {
            guard i < 50 else {
                return NSAttributedString(string: "\(i)" + separatorString + rule.text + "\n\n")
            }
            let imageName = String(i + 1) + ".circle.fill"
            let image = UIImage(systemName: imageName, withConfiguration: configuration)!
            let attachment = NSTextAttachment()
            attachment.image = image.withTintColor(Asset.Colors.Label.primary.color)
            let imageAttribute = NSMutableAttributedString(attachment: attachment)
            imageAttribute.addAttributes([NSAttributedString.Key.baselineOffset : -1.5], range: NSRange(location: 0, length: imageAttribute.length))
        
            let ruleString = NSAttributedString(string: separatorString + rule.text + "\n\n")
            attributedString.append(imageAttribute)
            attributedString.append(ruleString)
        }
        return attributedString
    }
    
}
