import Adamantium
import SwiftUI

public struct VersioningV4Background: View {
    public enum ViewStyle {
        case v4BlueStandard
        case v4BlueZoomedIn
        case v4PurpleStandard
        case v4_5Orange

        var scale: Float {
            switch self {
            case .v4BlueStandard,
                 .v4PurpleStandard:
                return 2.0
            case .v4BlueZoomedIn:
                return 0.4
            case .v4_5Orange:
                return 1.0
            }
        }

        var chevronScale: Float {
            switch self {
            case .v4BlueStandard,
                 .v4PurpleStandard:
                return 9.0
            case .v4BlueZoomedIn:
                return 2.0
            case .v4_5Orange:
                return 0 // No chevron
            }
        }

        var morhSpeed: Float {
            switch self {
            case .v4BlueStandard,
                 .v4PurpleStandard:
                return 0.1
            case .v4BlueZoomedIn,
                 .v4_5Orange:
                return 0.05
            }
        }
    }

    @ObservedObject private var chevronAuraCoordinator = ChevronAuraView.Coordinator()
    let style: ViewStyle

    public init(
        style: ViewStyle)
    {
        self.style = style
    }

    public var body: some View {
        ZStack {
            switch style {
            case .v4BlueStandard, .v4BlueZoomedIn:
                version4BlueAuraView
            case .v4PurpleStandard:
                version4PurpleAuraView
            case .v4_5Orange:
                version4_5OrangeAuraView
            }
        }
    }

    @ViewBuilder
    var version4BlueAuraView: some View {
        #if targetEnvironment(simulator)
            Color.black
        #else
            ChevronAuraView(
                chevronAuraCoordinator,
                colorSetA: .custom(
                    .custom(0.20676416, 0.25236923, 0.7863099),
                    .custom(0.053897105, 0.46197212, 0.9907573),
                    .custom(0.20676416, 0.25236923, 0.7863099)
                ),
                colorSetB: .custom(
                    .custom(0.20676416, 0.25236923, 0.7863099),
                    .custom(0.053897105, 0.46197212, 0.9907573),
                    .custom(0.20676416, 0.25236923, 0.7863099)
                ),
                morphSpeed: style.morhSpeed,
                scale: style.scale,
                seed: .zero,
                chevronScale: style.chevronScale,
                chevronOffsetX: .zero,
                chevronOffsetY: .zero,
                chevronRotation: 0.785,
                chevronVerticalOffsetVelocity: .zero,
                chevronAuraBFractalNoiseZOffset: 1.000,
                repeatUVMixRatio: 0.123,
                repeatUVScalar: 1.000
            )
        #endif
    }

    var version4PurpleAuraView: some View {
        #if targetEnvironment(simulator)
            Color.black
        #else
            ChevronAuraView(
                chevronAuraCoordinator,
                colorSetA: .custom(
                    .custom(0.26516747, -0.02533797, 0.43324512),
                    .custom(0.37601227, -0.04717753, 0.69405705),
                    .custom(0.26516747, -0.02533797, 0.43324512)
                ),
                colorSetB: .custom(
                    .custom(0.26516747, -0.02533797, 0.43324512),
                    .custom(0.37601227, -0.04717753, 0.69405705),
                    .custom(0.26516747, -0.02533797, 0.43324512)
                ),
                morphSpeed: style.morhSpeed,
                scale: style.scale,
                seed: .zero,
                chevronScale: style.chevronScale,
                chevronOffsetX: .zero,
                chevronOffsetY: .zero,
                chevronRotation: 0.785,
                chevronVerticalOffsetVelocity: .zero,
                chevronAuraBFractalNoiseZOffset: 2.000,
                repeatUVMixRatio: 0.166,
                repeatUVScalar: 1.000
            )
        #endif
    }

    var version4_5OrangeAuraView: some View {
        #if targetEnvironment(simulator)
            Color.orange
        #else
            AuraShaderView(
                id: "version-4_5-upgrade-alert",
                appPreset: .pinkYellowOrange,
                morphSpeed: style.morhSpeed,
                scale: style.scale
            )
        #endif
    }
}
