//  Class to define a event entry
//

import UIKit

class PopupInput
{

var wrapper: UIView?
var label: UILabel?
var text: UITextField?
var m_text: UITextView?
var button: UIButton?

var value: Int?
var drops: [ String]?

//  Input text field
//
init(_ view: UIStackView, l_str: String, def: String, keyb: UIKeyboardType = .default, key_del: UITextFieldDelegate)
{

    let w = mk_label(l_str);
    wrapper = w

    value = nil

    let t = UITextField()
    text = t

    t.text = def
    t.keyboardType = keyb
    t.placeholder = l_str
    t.font = UIFont.systemFont(ofSize: 24, weight: .regular)
    t.textColor = .label
    t.backgroundColor = .secondarySystemBackground
    t.layer.cornerRadius = 10.0
    t.layer.masksToBounds = true
    t.textAlignment = .right
    t.translatesAutoresizingMaskIntoConstraints = false // Required for Auto Layout
    t.delegate = key_del
    w.addSubview(t)
    NSLayoutConstraint.activate([
        t.centerYAnchor.constraint(equalTo: label!.centerYAnchor),
        t.leadingAnchor.constraint(equalTo: label!.trailingAnchor, constant: 10),
        t.trailingAnchor.constraint(equalTo: w.trailingAnchor)
    ])
    t.setContentHuggingPriority(.defaultHigh, for: .horizontal)

    view.addArrangedSubview(w)
    NSLayoutConstraint.activate([
        w.heightAnchor.constraint(equalTo: label!.heightAnchor),
        w.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        w.trailingAnchor.constraint(equalTo: view.trailingAnchor)
    ])
}

//  Multiline input text field
//
init(_ view: UIStackView, l_str: String, def: String, lines: CGFloat, key_del: UITextViewDelegate)
{

    let w = mk_label(l_str);
    wrapper = w

    value = nil

    let t = UITextView()
    m_text = t

    t.text = def.replacing("\",\"", with: "\",\n\"")
    t.font = UIFont.systemFont(ofSize: 24, weight: .regular)
    let fh = font_h(24)
    t.textColor = .label
    t.backgroundColor = .secondarySystemBackground
    t.layer.cornerRadius = 10.0
    t.layer.masksToBounds = true
    t.textAlignment = .left
    t.isScrollEnabled = true
    t.translatesAutoresizingMaskIntoConstraints = false // Required for Auto Layout
    t.delegate = key_del
    w.addSubview(t)
    NSLayoutConstraint.activate([
        t.topAnchor.constraint(equalTo: label!.bottomAnchor, constant: 10),
        t.leadingAnchor.constraint(equalTo: w.leadingAnchor),
        t.trailingAnchor.constraint(equalTo: w.trailingAnchor),
        t.heightAnchor.constraint(equalToConstant: fh * lines),
    ])
    t.setContentHuggingPriority(.defaultHigh, for: .horizontal)

    view.addArrangedSubview(w)
    NSLayoutConstraint.activate([
        w.heightAnchor.constraint(equalToConstant: fh * (lines + 1)),
        w.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        w.trailingAnchor.constraint(equalTo: view.trailingAnchor)
    ])
}

//  Drop down menu
//
init(_ view: UIStackView,
     l_str: String,
     drops: [ String ],
     def: Int,
     cb: @escaping (_ chg: Int) -> ())
{
    var actions: [ UIAction ] = []

    let w = mk_label(l_str);
    wrapper = w

    for i in 0..<drops.count {
        let act = UIAction(title: drops[i]) { _ in
            self.button?.setTitle(drops[i], for: .normal)
            self.value = i
            cb(i)
        }
        actions.append(act)
    }
    self.drops = drops

    let menu = UIMenu(title: l_str, children: actions)

    value = def
    let b = UIButton(type: .system)
    button = b
    b.setTitle(drops[def], for: .normal)
    b.titleLabel?.font = UIFont.systemFont(ofSize: 24, weight: .regular)
    b.menu = menu
    b.showsMenuAsPrimaryAction = true // Makes menu appear on tap
    b.translatesAutoresizingMaskIntoConstraints = false // Required for Auto Layout
    w.addSubview(b)
    NSLayoutConstraint.activate([
        b.centerYAnchor.constraint(equalTo: label!.centerYAnchor),
        b.trailingAnchor.constraint(equalTo: w.trailingAnchor, constant: 0)
    ])

    view.addArrangedSubview(w)
    NSLayoutConstraint.activate([
        w.heightAnchor.constraint(equalTo: label!.heightAnchor),
        w.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        w.trailingAnchor.constraint(equalTo: view.trailingAnchor)
    ])
}

//  Left label/right button
//
//  TODO: Fix this, the button tap is not recognized
//
init(_ view: UIStackView, l_str: String, button: String, cb: Selector)
{

    let w = mk_label(l_str);
    wrapper = w

    value = nil

    let b = UIButton(type: .system)

    b.setTitle(button, for: .normal)
    b.setTitleColor(.label, for: .normal)
    b.backgroundColor = .secondarySystemBackground
    b.addTarget(self, action: #selector(action), for: .allEvents)
    b.layer.cornerRadius = 10.0
    b.layer.masksToBounds = true
    b.translatesAutoresizingMaskIntoConstraints = false // Required for Auto Layout
    w.addSubview(b)
    NSLayoutConstraint.activate([
        b.centerYAnchor.constraint(equalTo: label!.centerYAnchor),
        b.trailingAnchor.constraint(equalTo: w.trailingAnchor)
    ])

    view.addArrangedSubview(w)
    NSLayoutConstraint.activate([
        w.heightAnchor.constraint(equalTo: label!.heightAnchor),
        w.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        w.trailingAnchor.constraint(equalTo: view.trailingAnchor)
    ])
}

@objc
func action(_ but: UIButton)
{

Log.l("PopupInput:action(\(but)")
}

func mk_label(_ str: String) -> UIView
{

    let wrapper = UIView()
    wrapper.translatesAutoresizingMaskIntoConstraints = false // Required for Auto Layout

    let l = UILabel()
    label = l

    l.text = str
    l.font = UIFont.systemFont(ofSize: 24, weight: .regular)
    l.textColor = .label
    l.translatesAutoresizingMaskIntoConstraints = false // Required for Auto Layout
    wrapper.addSubview(l)
    NSLayoutConstraint.activate([
        l.topAnchor.constraint(equalTo: wrapper.topAnchor),
        l.leadingAnchor.constraint(equalTo: wrapper.leadingAnchor, constant: 0)
    ])
    l.setContentHuggingPriority(.required, for: .horizontal)
    return wrapper
}

func set_lbl(_ str: String) { label?.text = str }

func get_int() -> Int { return value! }

func get_string() -> String { return text!.text ?? "" }
func get_multi() -> String { return m_text!.text ?? "" }

func get_drop() -> String { return (drops?[value!])! }

func show(_ str: String, hide: Bool)
{
    label!.text = str
    wrapper!.isHidden = hide
}

func font_h(_ size: CGFloat) -> CGFloat
{

    let font = UIFont.systemFont(ofSize: size)
    return font.lineHeight
}

}
