//
//  RNDragDropView.swift
//  Example
//
//  Created by Sam Ding on 11/15/20.
//

import Foundation
import UIKit
import MobileCoreServices


@objc(DropZone)
class DropZone: UIView {
    
  // MARK: - Variables
  @objc var onDragEnter: RCTBubblingEventBlock?
  @objc var onDragOver: RCTBubblingEventBlock?
  @objc var onDragLeave: RCTBubblingEventBlock?
  @objc var onDragExit: RCTBubblingEventBlock?
  @objc var onProcessingDrop: RCTBubblingEventBlock?
  @objc var onDrop: RCTBubblingEventBlock?
  
  internal let typeCount = 6
  internal var _allowedDataTypes: Set<DataType> = Set(DataType.allCases)
  
  @objc var allowedDataTypes: [String] {
    get {
      return _allowedDataTypes.map { $0.rawValue }
    }
    set {
      allowDataTypes(newValue)
    }
  }
  
  var allowedTypeIdentifiers: [String] {
    if _allowedDataTypes.count == DataType.allCases.count {
      return ["public.data"]
    } else {
      return _allowedDataTypes.map { $0.baseUTType }
    }
  }

  /// Items that are passed to React Native
  internal var items : [String: Any] = [:]
  
  // MARK: - Intializers
  override init(frame: CGRect) {
    super.init(frame: frame)
    
    // Add drop interaction to the view
    self.addInteraction(UIDropInteraction(delegate: self))
    
  }
  
  required init?(coder: NSCoder) {
    super.init(coder: coder)
  }
    
  // Enable Drop Interaction for these Data Types
  // Text, URL, Image, Video, Audio, File
  @objc func allowDataTypes(_ types: [String]){
    let allowedDataTypesArr = types
      .map({ $0.lowercased().trimmingCharacters(in: .whitespaces)})
      .compactMap { DataType(rawValue: $0) }
    _allowedDataTypes = Set(allowedDataTypesArr)
  }

}

