import UIKit
import Shared

final class SettingsSwitcher: UIView {
    let titleLabel = UILabel()
    let textLabel = UILabel()
    let iconImageView = UIImageView()
    let separatorView = UIView()
    let switcherView = UISwitch()
    let stackView = UIStackView()
    let verticalStackView = UIStackView()

    init() {
        super.init(frame: .zero)

        textLabel.textColor = Asset.neutralWeak.color
        titleLabel.textColor = Asset.neutralActive.color
        switcherView.onTintColor = Asset.brandPrimary.color
        separatorView.backgroundColor = Asset.neutralLine.color

        iconImageView.contentMode = .center
        iconImageView.setContentHuggingPriority(.required, for: .horizontal)

        textLabel.numberOfLines = 0
        textLabel.font = Fonts.Mulish.regular.font(size: 12.0)
        titleLabel.font = Fonts.Mulish.semiBold.font(size: 14.0)

        addSubview(stackView)
        addSubview(separatorView)

        verticalStackView.spacing = 3
        verticalStackView.axis = .vertical
        verticalStackView.addArrangedSubview(titleLabel)
        verticalStackView.addArrangedSubview(textLabel)

        let icon = iconImageView.pinning(at: .top(0))

        stackView.spacing = 8
        stackView.addArrangedSubview(icon)
        stackView.addArrangedSubview(verticalStackView)
        stackView.addArrangedSubview(switcherView.pinning(at: .top(0)))

        stackView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(16)
            make.left.equalToSuperview()
            make.right.equalToSuperview()
            make.bottom.equalToSuperview().offset(-20)
        }

        separatorView.snp.makeConstraints { make in
            make.height.equalTo(1)
            make.left.equalToSuperview()
            make.right.equalToSuperview()
            make.bottom.equalToSuperview()
        }
    }

    required init?(coder: NSCoder) { nil }

    func set(
        title: String,
        text: String? = nil,
        icon: UIImage? = nil,
        separator: Bool = true,
        extraAction: UIButton? = nil
    ) {
        titleLabel.text = title

        if let content = text {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineHeightMultiple = 1.5

            textLabel.attributedText = NSAttributedString(
                string: content, attributes: [.paragraphStyle: paragraphStyle]
            )
        } else {
            verticalStackView.removeArrangedSubview(textLabel)
        }

        if let icon = icon {
            iconImageView.image = icon
        } else {
            stackView.removeArrangedSubview(iconImageView)
        }

        if let button = extraAction {
            stackView.insertArrangedSubview(button.pinning(at: .top(0)), at: 2)
        }

        guard separator == true else {
            separatorView.removeFromSuperview()
            return
        }
    }
}

final class SettingsInfoSwitcher: UIView {
    let titleView = TextWithInfoView()
    let textLabel = UILabel()
    let iconImageView = UIImageView()
    let separatorView = UIView()
    let switcherView = UISwitch()
    let stackView = UIStackView()
    let verticalStackView = UIStackView()

    var didTapInfo: (() -> Void)?

    init() {
        super.init(frame: .zero)

        textLabel.textColor = Asset.neutralWeak.color
        switcherView.onTintColor = Asset.brandPrimary.color
        separatorView.backgroundColor = Asset.neutralLine.color

        iconImageView.contentMode = .center
        iconImageView.setContentHuggingPriority(.required, for: .horizontal)

        textLabel.numberOfLines = 0
        textLabel.font = Fonts.Mulish.regular.font(size: 12.0)
        textLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

        addSubview(stackView)
        addSubview(separatorView)

        let titleContainer = UIView()
        titleContainer.addSubview(titleView)
        titleView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(-10)
            make.left.equalToSuperview().offset(-4)
            make.right.equalToSuperview()
            make.bottom.equalToSuperview().offset(10)
        }

        verticalStackView.spacing = 3
        verticalStackView.axis = .vertical
        verticalStackView.addArrangedSubview(titleContainer.pinning(at: .left(0)))
        verticalStackView.addArrangedSubview(textLabel)

        let icon = iconImageView.pinning(at: .top(0))

        let switcherContainer = UIView()
        switcherContainer.addSubview(switcherView)
        switcherView.setContentCompressionResistancePriority(.required, for: .horizontal)
        switcherContainer.setContentCompressionResistancePriority(.required, for: .horizontal)

        switcherView.snp.makeConstraints { make in
            make.top.equalToSuperview()
            make.left.equalToSuperview()
            make.right.equalToSuperview()
            make.bottom.lessThanOrEqualToSuperview()
        }

        stackView.spacing = 8
        stackView.addArrangedSubview(icon)
        stackView.addArrangedSubview(verticalStackView)
        stackView.addArrangedSubview(switcherContainer)

        stackView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(16)
            make.left.equalToSuperview()
            make.right.equalToSuperview()
            make.bottom.equalToSuperview().offset(-20)
        }

        separatorView.snp.makeConstraints { make in
            make.height.equalTo(1)
            make.left.equalToSuperview()
            make.right.equalToSuperview()
            make.bottom.equalToSuperview()
        }
    }

    required init?(coder: NSCoder) { nil }

    func set(
        title: String,
        text: String? = nil,
        icon: UIImage? = nil,
        separator: Bool = true,
        extraAction: UIButton? = nil,
        didTapInfo: (() -> Void)? = nil
    ) {
        self.didTapInfo = didTapInfo

        titleView.setup(
            text: title,
            attributes: [
                .foregroundColor: Asset.neutralActive.color,
                .font: Fonts.Mulish.semiBold.font(size: 14.0) as Any
            ], didTapInfo: { self.didTapInfo?() }
        )

        if let content = text {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineHeightMultiple = 1.5

            textLabel.attributedText = NSAttributedString(
                string: content, attributes: [.paragraphStyle: paragraphStyle]
            )
        } else {
            verticalStackView.removeArrangedSubview(textLabel)
        }

        if let icon = icon {
            iconImageView.image = icon
        } else {
            stackView.removeArrangedSubview(iconImageView)
        }

        if let button = extraAction {
            stackView.insertArrangedSubview(button.pinning(at: .top(0)), at: 2)
        }

        guard separator == true else {
            separatorView.removeFromSuperview()
            return
        }
    }
}