//
//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//

import Foundation
import SessionUIKit

class ReminderView: UIView {

    let label = UILabel()

    typealias Action = () -> Void

    var tapAction: Action?

    var text: String? {
        get {
            return label.text
        }

        set(newText) {
            label.text = newText
        }
    }

    enum ReminderViewMode {
        // Nags are urgent interactive prompts, bidding for the user's attention.
        case nag
        // Explanations are not interactive or urgent.
        case explanation
    }
    let mode: ReminderViewMode

    @available(*, unavailable, message:"use other constructor instead.")
    required init?(coder aDecoder: NSCoder) {
        notImplemented()
    }

    @available(*, unavailable, message:"use other constructor instead.")
    override init(frame: CGRect) {
        notImplemented()
    }

    private init(mode: ReminderViewMode,
         text: String, tapAction: Action?) {
        self.mode = mode
        self.tapAction = tapAction

        super.init(frame: .zero)

        self.text = text

        setupSubviews()
    }

    @objc public class func nag(text: String, tapAction: Action?) -> ReminderView {
        return ReminderView(mode: .nag, text: text, tapAction: tapAction)
    }

    @objc public class func explanation(text: String) -> ReminderView {
        return ReminderView(mode: .explanation, text: text, tapAction: nil)
    }

    func setupSubviews() {
        let textColor: UIColor
        let iconColor: UIColor
        switch mode {
        case .nag:
            self.backgroundColor = UIColor.ows_reminderYellow
            textColor = UIColor.ows_gray90
            iconColor = UIColor.ows_gray60
        case .explanation:
            // TODO: Theme, review with design.
            self.backgroundColor = Colors.unimportant
            textColor = Colors.text
            iconColor = Colors.separator
        }
        self.clipsToBounds = true

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:)))
        self.addGestureRecognizer(tapGesture)

        let container = UIStackView()
        container.axis = .horizontal
        container.alignment = .center
        container.isLayoutMarginsRelativeArrangement = true

        self.addSubview(container)
        container.layoutMargins = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16)
        container.ows_autoPinToSuperviewEdges()

        // Label
        label.font = UIFont.ows_dynamicTypeSubheadline
        container.addArrangedSubview(label)
        label.textColor = textColor
        label.numberOfLines = 0
        label.lineBreakMode = .byWordWrapping

        // Show the disclosure indicator if this reminder has a tap action.
        if tapAction != nil {
            // Icon
            let iconName = (CurrentAppContext().isRTL ? "system_disclosure_indicator_rtl" : "system_disclosure_indicator")
            guard let iconImage = UIImage(named: iconName) else {
                owsFailDebug("missing icon.")
                return
            }
            let iconView = UIImageView(image: iconImage.withRenderingMode(.alwaysTemplate))
            iconView.contentMode = .scaleAspectFit
            iconView.tintColor = iconColor
            iconView.autoSetDimension(.width, toSize: 13)
            container.addArrangedSubview(iconView)
        }
    }

    @objc func handleTap(gestureRecognizer: UIGestureRecognizer) {
        guard gestureRecognizer.state == .recognized else {
            return
        }
        tapAction?()
    }
}