import UIKit

class PokemonView: UIImageView {}

class ViewController: UIViewController {
    let snorlaxView = PokemonView()
    let slowpokeView = PokemonView()
    let dittoView = PokemonView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        
        // Snorlax
        snorlaxView.image = UIImage(named: "snorlax")
        snorlaxView.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
        snorlaxView.isUserInteractionEnabled = true
        snorlaxView.backgroundColor = .lightGray
        view.addSubview(snorlaxView)
        
        let snorlaxInteraction = UIContextMenuInteraction(delegate: self)
        snorlaxView.addInteraction(snorlaxInteraction)
        
        // Slowpoke
        slowpokeView.image = UIImage(named: "slowpoke")
        slowpokeView.frame = CGRect(x: 250, y: 100, width: 100, height: 100)
        slowpokeView.isUserInteractionEnabled = true
        slowpokeView.backgroundColor = .lightGray
        view.addSubview(slowpokeView)
        
        let slowpokeInteraction = UIContextMenuInteraction(delegate: self)
        slowpokeView.addInteraction(slowpokeInteraction)
        
        // Ditto
        dittoView.image = UIImage(named: "ditto")
        dittoView.frame = CGRect(x: 100, y: 250, width: 100, height: 100)
        dittoView.isUserInteractionEnabled = true
        dittoView.backgroundColor = .lightGray
        view.addSubview(dittoView)
        
        let dittoInteraction = UIContextMenuInteraction(delegate: self)
        dittoView.addInteraction(dittoInteraction)
    }
    
    override open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touchevent = touches.first, let pokemonView = touchevent.view as? PokemonView else {
            return
        }
        let previousLocation = touchevent.previousLocation(in: view)
        let nextLocation = touchevent.location(in: view)
        
        let deltaX = nextLocation.x - previousLocation.x
        let deltaY = nextLocation.y - previousLocation.y
        pokemonView.frame.origin.x += deltaX
        pokemonView.frame.origin.y += deltaY
    }
}

extension ViewController: UIContextMenuInteractionDelegate {
    func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
        return UIContextMenuConfiguration(identifier: nil, previewProvider: nil, actionProvider: { suggestedActions in
            let fight = UIAction(title: "FIGHT", image: UIImage(systemName: "figure.wave")) { action in
                print("fight")
            }
            let bag = UIAction(title: "BAG", image: UIImage(systemName: "bag")) { action in
                print("bag")
            }
            let pokemon = UIAction(title: "POKEMON", image: UIImage(systemName: "hare")) { action in
                print("pokemon")
            }
            let run = UIAction(title: "RUN", image: UIImage(systemName: "figure.walk")) { action in
                print("run")
            }
            return UIMenu(title: "Menu", children: [fight, bag, pokemon, run])
        })
    }
}