//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

@_exported import GameplayKit // Clang module
import CoreGraphics
import simd


@available(iOS, introduced: 9.0)
@available(OSX, introduced: 10.11)
@available(tvOS, introduced: 9.0)
extension GKPath {
  /// Creates a path from an array of points
  /// - Parameter points: an array of simd.float2 points to make a path from
  /// - Parameter radius: radius of the path to create
  /// - Parameter cyclical: if the path is of a cycle that loops back on itself
  public convenience init(points: [simd.float2], radius: Float, cyclical: Bool) {
    var variablePoints = points
    self.init(__points: &variablePoints, count: points.count, radius: radius, cyclical: cyclical)
  }
}


@available(iOS, introduced: 10.0)
@available(OSX, introduced: 10.12)
@available(tvOS, introduced: 10.0)
extension GKPath {
  /// Creates a path from an array of points
  /// - Parameter points: an array of simd.float3 points to make a path from
  /// - Parameter radius: the radius of the path to create
  /// - Parameter cyclical: if the path is of a cycle that loops back on itself
  public convenience init(points: [simd.float3], radius: Float, cyclical: Bool) {
    var variablePoints = points
    self.init(__float3Points: &variablePoints, count: points.count, radius: radius, cyclical: cyclical)
  }
}

@available(iOS, introduced: 9.0)
@available(OSX, introduced: 10.11)
@available(tvOS, introduced: 9.0)
extension GKPolygonObstacle {
  /// Creates a polygon obstacle with an array of points.
  /// - Parameter points: array of points in counter-clockwise order that are the vertices of a convex polygon
  public convenience init(points: [simd.float2]) {
    var variablePoints = points
    self.init(__points: &variablePoints, count: points.count)
  }
}

@available(iOS, introduced: 9.0)
@available(OSX, introduced: 10.11)
@available(tvOS, introduced: 9.0)
extension GKEntity {
  /// Gets the component of the indicated class.  Returns nil if entity does not have this component
  /// - Parameter ofType: the type of the component you want to get
  public func component<ComponentType : GKComponent>(ofType componentClass: ComponentType.Type) -> ComponentType? {
     return self.__component(for: componentClass) as? ComponentType
  }
  /// Removes the component of the indicates class from this entity
  /// - Parameter ofType: the type of component you want to remove
  public func removeComponent<ComponentType : GKComponent>(ofType componentClass: ComponentType.Type) {
     self.__removeComponent(for: componentClass)
  }
}

@objc
internal protocol _SwiftGKStateMachineLike {
  @objc(stateForClass:)
  func state(forClass: AnyClass) -> AnyObject?
}

@available(iOS, introduced: 9.0)
@available(OSX, introduced: 10.11)
@available(tvOS, introduced: 9.0)
extension GKStateMachine {
  /// Gets the state of the indicated class.  Returns nil if the state machine does not have this state.
  /// - Parameter forClass: the type of the state you want to get
  public func state<StateType : GKState>(
    forClass stateClass: StateType.Type) -> StateType? {
    // FIXME: GameplayKit marked state(forClass:) unavailable, which means we
    // can't use it from SwiftPrivate. Bounce through perform(_:with:) instead.
    return self.perform(#selector(_SwiftGKStateMachineLike.state(forClass:)), with: stateClass)?.takeUnretainedValue() as! StateType?
  }
}

