
import Foundation
import Metal

public class CloudySkyRenderable: ConfiguredQuadRenderable<CloudySkyRenderable.Config> {
    
    public struct Config: QuadRenderConfiguration {
        // matches CloudySky_Uniforms
        internal var resolution: ADVector2
        internal var time:      ADFloat

        internal var cloudscale: ADFloat
        internal var speed:      ADFloat
        internal var clouddark:  ADFloat
        internal var cloudlight: ADFloat
        internal var cloudcover: ADFloat
        internal var cloudalpha: ADFloat
        internal var skytint:    ADFloat

        internal var skycolour1: ADVector3
        internal var skycolour2: ADVector3

        public init(
            resolution: ADVector2 = .ones,
            time:       ADFloat   = .zero,
            cloudscale: ADFloat   = 1.1,
            speed:      ADFloat   = 0.03,
            clouddark:  ADFloat   = 0.5,
            cloudlight: ADFloat   = 0.3,
            cloudcover: ADFloat   = 0.2,
            cloudalpha: ADFloat   = 8.0,
            skytint:    ADFloat   = 0.5,
            skycolour1: ADVector3 = .init(x: 0.2, y: 0.4, z: 0.6),
            skycolour2: ADVector3 = .init(x: 0.4, y: 0.7, z: 1.0)
        ) {
            self.resolution = resolution
            self.time       = time
            self.cloudscale = cloudscale
            self.speed      = speed
            self.clouddark  = clouddark
            self.cloudlight = cloudlight
            self.cloudcover = cloudcover
            self.cloudalpha = cloudalpha
            self.skytint    = skytint
            self.skycolour1 = skycolour1
            self.skycolour2 = skycolour2
        }

        public static var defaultConfiguration: Config {
            return Config()
        }
    }

    /// Name of the Metal fragment function in your `.metal` library
    override public var fragmentShaderName: String {
        return "clouds_fragment"
    }

    /// Hook to set up any extra state before drawing;
    /// here all your `Config` fields are bound automatically.
    override public var configureAction: ConfigureAction {
        return { encoder in
            super.configureAction(encoder)
            // if you ever need to tweak bindings manually, do it here
        }
    }
}
