import UIKit
import Shared
import Combine

public final class OutlinedInputField: UIView {
    private let stackView = UIStackView()
    private let textField = UITextField()
    private let placeholderLabel = UILabel()
    private let inputContainerView = UIView()

    private let secureInputButton = SecureInputButton()

    public var textPublisher: AnyPublisher<String, Never> {
        textField.textPublisher
    }

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

        layer.borderWidth = 1.0
        layer.cornerRadius = 4.0
        layer.masksToBounds = true
        layer.borderColor = Asset.neutralWeak.color.cgColor

        textField.delegate = self
        textField.backgroundColor = .clear
        textField.textColor = Asset.neutralDark.color
        placeholderLabel.textColor = Asset.neutralWeak.color
        placeholderLabel.font = Fonts.Mulish.regular.font(size: 16.0)

        secureInputButton.button.addTarget(self, action: #selector(didTapRight), for: .touchUpInside)

        inputContainerView.addSubview(placeholderLabel)
        inputContainerView.addSubview(textField)

        stackView.addArrangedSubview(inputContainerView)
        stackView.addArrangedSubview(secureInputButton)

        addSubview(stackView)

        placeholderLabel.snp.makeConstraints {
            $0.top.equalToSuperview().offset(15)
            $0.left.equalToSuperview().offset(15)
            $0.right.lessThanOrEqualToSuperview().offset(-15)
            $0.bottom.equalToSuperview().offset(-18)
        }

        textField.snp.makeConstraints {
            $0.top.equalToSuperview().offset(15)
            $0.left.equalToSuperview().offset(15)
            $0.right.equalToSuperview().offset(-15)
            $0.bottom.equalToSuperview().offset(-18)
        }

        stackView.snp.makeConstraints {
            $0.edges.equalToSuperview()
        }
    }

    required init?(coder: NSCoder) { nil }

    public func setup(title: String, sensitive: Bool = false) {
        placeholderLabel.text = title
        textField.isSecureTextEntry = sensitive
        secureInputButton.isHidden = !sensitive
    }

    @objc private func didTapRight() {
        textField.isSecureTextEntry.toggle()
        secureInputButton.setSecure(textField.isSecureTextEntry)
    }
}

extension OutlinedInputField: UITextFieldDelegate {
    public func textField(
        _ textField: UITextField,
        shouldChangeCharactersIn range: NSRange,
        replacementString string: String
    ) -> Bool {
        placeholderLabel.alpha = (textField.text! as NSString)
            .replacingCharacters(in: range, with: string)
            .count > 0 ? 0.0 : 1.0
        return true
    }
}