// Copyright © 2021 Metabolist. All rights reserved.

import UIKit

final class NewItemsView: UIView {
    let button = UIButton()

    public var title: String? {
        get { label.text }
        set {
            label.text = newValue
            button.accessibilityLabel = newValue
        }
    }

    private let label = UILabel()
    private let blurView: UIVisualEffectView
    private let vibrancyView: UIVisualEffectView

    init() {
        let blurEffect = UIBlurEffect(style: .systemChromeMaterial)
        blurView = UIVisualEffectView(effect: blurEffect)
        vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect, style: .label))

        super.init(frame: .zero)

        initialSetup()
    }

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

    override func layoutSubviews() {
        super.layoutSubviews()

        let cornerRadius = bounds.height / 2

        layer.cornerRadius = cornerRadius
        blurView.layer.cornerRadius = cornerRadius
        layer.shadowPath = UIBezierPath(roundedRect: layer.bounds, cornerRadius: cornerRadius).cgPath
    }
}

private extension NewItemsView {
    // swiftlint:disable:next function_body_length
    func initialSetup() {
        backgroundColor = .clear
        layer.shadowOffset = .zero
        layer.shadowRadius = .defaultShadowRadius
        layer.shadowOpacity = .defaultShadowOpacity

        addSubview(blurView)
        blurView.translatesAutoresizingMaskIntoConstraints = false
        blurView.clipsToBounds = true
        blurView.contentView.addSubview(vibrancyView)
        vibrancyView.translatesAutoresizingMaskIntoConstraints = false

        let stackView = UIStackView()

        vibrancyView.contentView.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.spacing = .defaultSpacing

        let arrowImage = UIImage(systemName: "arrow.up",
                                 withConfiguration: UIImage.SymbolConfiguration(weight: .bold))

        stackView.addArrangedSubview(UIImageView(image: arrowImage))
        stackView.addArrangedSubview(label)
        label.adjustsFontForContentSizeCategory = true
        label.font = .preferredFont(forTextStyle: .headline)

        addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false

        let touchStartAction = UIAction { [weak self] _ in self?.alpha = 0.75 }

        button.addAction(touchStartAction, for: .touchDown)
        button.addAction(touchStartAction, for: .touchDragEnter)

        let touchEndAction = UIAction { [weak self] _ in self?.alpha = 1 }

        button.addAction(touchEndAction, for: .touchDragExit)
        button.addAction(touchEndAction, for: .touchUpInside)
        button.addAction(touchEndAction, for: .touchUpOutside)
        button.addAction(touchEndAction, for: .touchCancel)

        NSLayoutConstraint.activate([
            blurView.leadingAnchor.constraint(equalTo: leadingAnchor),
            blurView.topAnchor.constraint(equalTo: topAnchor),
            blurView.trailingAnchor.constraint(equalTo: trailingAnchor),
            blurView.bottomAnchor.constraint(equalTo: bottomAnchor),
            button.leadingAnchor.constraint(equalTo: leadingAnchor),
            button.topAnchor.constraint(equalTo: topAnchor),
            button.trailingAnchor.constraint(equalTo: trailingAnchor),
            button.bottomAnchor.constraint(equalTo: bottomAnchor),
            vibrancyView.leadingAnchor.constraint(equalTo: blurView.contentView.leadingAnchor),
            vibrancyView.topAnchor.constraint(equalTo: blurView.contentView.topAnchor),
            vibrancyView.trailingAnchor.constraint(equalTo: blurView.contentView.trailingAnchor),
            vibrancyView.bottomAnchor.constraint(equalTo: blurView.contentView.bottomAnchor),
            stackView.leadingAnchor.constraint(equalTo: vibrancyView.contentView.leadingAnchor,
                                               constant: .defaultSpacing),
            stackView.topAnchor.constraint(equalTo: vibrancyView.contentView.topAnchor, constant: .defaultSpacing),
            stackView.trailingAnchor.constraint(equalTo: vibrancyView.contentView.trailingAnchor,
                                                constant: -.defaultSpacing * 2),
            stackView.bottomAnchor.constraint(equalTo: vibrancyView.contentView.bottomAnchor,
                                              constant: -.defaultSpacing)
        ])
    }
}
