/*
Copyright 2015-present the Material Components for iOS authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import UIKit

// This viewcontroller contains a subview that has an MDCShadowLayer.
// A gesture recognizer allows the user to adjust the elevation of the
// shadowed view by pressing it, and move it by dragging it.

class ShadowDragSquareExampleViewController: UIViewController {

  @IBOutlet weak var blueView: ExampleShadowedView!

  // A UILongPressGestureRecognizer handles the changing of elevation
  // and location of the shadowedView.
  let longPressRecogniser = UILongPressGestureRecognizer()

  // We store the offset from the initial touch to the center of the
  // view to properly update its location when dragged.
  var movingViewOffset = CGPoint.zero

  override func viewDidLoad() {
    super.viewDidLoad()

    // MDCShadowLayer's elevation will implicitly animate when changed, so to disable that behavior
    // we need to disable Core Animation actions inside of a transaction:
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    self.blueView.shadowLayer.elevation = .cardResting
    CATransaction.commit()

    longPressRecogniser.addTarget(self, action: #selector(longPressedInView))
    longPressRecogniser.minimumPressDuration = 0.0
    self.blueView.addGestureRecognizer(longPressRecogniser)
  }

  @objc func longPressedInView(_ sender: UILongPressGestureRecognizer) {
    // Elevation of the view is changed to indicate that it has been pressed or released.
    // view.center is changed to follow the touch events.
    if sender.state == .began {
      self.blueView.shadowLayer.elevation = .cardPickedUp

      let selfPoint = sender.location(in: self.view)
      movingViewOffset.x = selfPoint.x - self.blueView.center.x
      movingViewOffset.y = selfPoint.y - self.blueView.center.y

    } else if sender.state == .changed {
      let selfPoint = sender.location(in: self.view)
      let newCenterPoint =
          CGPoint(x: selfPoint.x - movingViewOffset.x, y: selfPoint.y - movingViewOffset.y)
      self.blueView.center = newCenterPoint

    } else if sender.state == .ended {
      self.blueView.shadowLayer.elevation = .cardResting

      movingViewOffset = CGPoint.zero
    }
  }

  // MARK: - CatalogByConvention

  @objc class func catalogBreadcrumbs() -> [String] {
    return [ "Shadow", "Shadow Layer"]
  }

  @objc class func catalogStoryboardName() -> String {
    return "ShadowDragSquareExample"
  }

  @objc class func catalogDescription() -> String {
    return "Shadow Layer implements the Material Design specifications for elevation and shadows."
  }

  @objc class func catalogIsPrimaryDemo() -> Bool {
    return true
  }

  @objc class func catalogIsPresentable() -> Bool {
    return true
  }
}
