// Copyright 2015-present 650 Industries. All rights reserved.

import Foundation

@objc
public class DevMenuSelectionList: DevMenuScreenItem, DevMenuCallableProvider {
  @objc
  public class Item: NSObject, DevMenuDataSourceItem {
    @objc
    public class Tag : NSObject {
      @objc
      public var text: () -> String = { "" }

      @objc
      public var glyphName: () -> String? = { nil }
      
      fileprivate func serialize() -> [String : Any] {
        return [
          "text": text(),
          "glyphName": glyphName() ?? NSNull(),
        ]
      }
    }
    
    @objc
    public var onClickData: () -> [String : Any]? =  { nil }
    
    @objc
    public var title: () -> String = { "" }

    @objc
    public var warning: () -> String? = { nil }
    
    @objc
    public var isChecked: () -> Bool = { false }
    
    @objc
    public var tags: () -> [Tag] = { [] }
    
    public func serialize() -> [String : Any] {
      return [
        "title": title(),
        "warning": warning() ?? NSNull(),
        "isChecked": isChecked(),
        "tags": tags().map { $0.serialize() },
        "onClickData": onClickData() ?? NSNull()
      ]
    }
  }
  
  public static var ActionID = 1
  private let callable: DevMenuExportedFunction
  private var items: [Item] = []
  private let dataSourceId: String?
  
  @objc
  public func addItem(_ item: Item) {
    items.append(item)
  }
  
  @objc
  public convenience init() {
    self.init(dataSourceId: nil)
  }
  
  @objc
  public init(dataSourceId: String?) {
    self.dataSourceId = dataSourceId
    self.callable = DevMenuExportedFunction(withId: "expo-dev-menu.selection-list.#\(DevMenuSelectionList.ActionID)", withFunction: { _ in })
    DevMenuSelectionList.ActionID += 1
    super.init(type: .SelectionList)
  }
  
  @objc
  public override func serialize() -> [String : Any] {
    var dict = super.serialize()
    dict["items"] = items.map { $0.serialize() }
    dict["dataSourceId"] = dataSourceId ?? NSNull()
    dict["actionId"] = self.callable.id
    return dict
  }
  
  @objc
  public func addOnClick(hander: @escaping ([String: Any]?) -> Void) {
    self.callable.function = hander
  }
  
  public func registerCallable() -> DevMenuExportedCallable? {
    return self.callable
  }
}
