// Copyright © 2021 Metabolist. All rights reserved.

import SDWebImage
import UIKit

final class EmojiView: UIView {
    private let imageView = SDAnimatedImageView()
    private let emojiLabel = UILabel()
    private var emojiConfiguration: EmojiContentConfiguration

    init(configuration: EmojiContentConfiguration) {
        emojiConfiguration = configuration

        super.init(frame: .zero)

        initialSetup()
        setupAccessibility()
        applyEmojiConfiguration()
    }

    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

extension EmojiView: UIContentView {
    var configuration: UIContentConfiguration {
        get { emojiConfiguration }
        set {
            guard let emojiConfiguration = newValue as? EmojiContentConfiguration else { return }

            self.emojiConfiguration = emojiConfiguration

            applyEmojiConfiguration()
        }
    }
}

private extension EmojiView {
    func initialSetup() {
        layoutMargins = .init(
            top: .compactSpacing,
            left: .compactSpacing,
            bottom: .compactSpacing,
            right: .compactSpacing)

        addSubview(imageView)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.contentMode = .scaleAspectFit

        addSubview(emojiLabel)
        emojiLabel.translatesAutoresizingMaskIntoConstraints = false
        emojiLabel.textAlignment = .center
        emojiLabel.adjustsFontSizeToFitWidth = true
        emojiLabel.font = .preferredFont(forTextStyle: .largeTitle)

        NSLayoutConstraint.activate([
            imageView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
            imageView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),
            imageView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
            imageView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor),
            emojiLabel.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
            emojiLabel.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),
            emojiLabel.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
            emojiLabel.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor)
        ])
    }

    func applyEmojiConfiguration() {
        if emojiConfiguration.viewModel.system {
            emojiLabel.isHidden = false
            emojiLabel.text = emojiConfiguration.viewModel.name
            imageView.isHidden = true
        } else {
            emojiLabel.isHidden = true
            emojiLabel.text = nil
            imageView.isHidden = false
            imageView.sd_setImage(with: emojiConfiguration.viewModel.url)
        }

        accessibilityLabel = emojiConfiguration.viewModel.name
    }

    func setupAccessibility() {
        isAccessibilityElement = true
    }
}
