import simd

public typealias ADFloat        = Float
public typealias ADInt          = Int32
public typealias ADVector3      = SIMD3<ADFloat>
public typealias ADVector2      = SIMD2<ADFloat>

public extension ADVector2 {
    static let zero: ADVector2 = [0, 0]
    static let ones: ADVector2 = [1, 1]
    static let x: ADVector2 = [1, 0]
    static let y: ADVector2 = [0, 1]
}

public extension ADVector3 {
    
    // MARK: Math
    static let zero: ADVector3 = [0, 0, 0]
    static let ones: ADVector3 = [1, 1, 1]
    
    static let xyz: ADVector3 = ones
    static let x: ADVector3 = [1, 0, 0]
    static let y: ADVector3 = [0, 1, 0]
    static let z: ADVector3 = [0, 0, 1]
    static let xy: ADVector3 = [1, 1, 0]
    static let xz: ADVector3 = [1, 0, 1]
    static let yz: ADVector3 = [0, 1, 1]
    
    // MARK: Colors
    static let white: ADVector3 = ADVector3.ones
    static let black: ADVector3 = ADVector3.zero
    static let red: ADVector3 = ADVector3.x
    static let green: ADVector3 = ADVector3.y
    static let blue: ADVector3 = ADVector3.z
    static let rainbow: [ADVector3] = [
        [1.0, 0.0, 0.0],
        [1.0, 0.5, 0.0],
        [1.0, 1.0, 0.0],
        [0.5, 1.0, 0.0],
        [0.0, 1.0, 0.0],
        [0.0, 1.0, 0.5],
        [0.0, 1.0, 1.0],
        [0.0, 0.5, 1.0],
        [0.0, 0.0, 1.0],
        [0.5, 0.0, 1.0],
        [1.0, 0.0, 1.0],
        [1.0, 0.0, 0.5]
    ]
    
    static func lerpVector(_ color: ADVector3, target: ADVector3, ratio: Float) -> ADVector3 {
        let aR = simd_mix(color.x, target.x, ratio)
        let aG = simd_mix(color.y, target.y, ratio)
        let aB = simd_mix(color.z, target.z, ratio)
        return simd_float3(x: aR, y: aG, z: aB)
    }
}
