import Foundation

/* Supported Background Presets */

public enum ShareAssetBackgroundPreset: Equatable {
    public enum PresetID: String, Identifiable {
        case aura
        case neon
        case cover
        case clouds
        case goo
        case gridWarp = "grid_warp"
        case space

        public var id: String {
            return rawValue
        }
    }

    public enum PresetStyle: Identifiable {
        public enum NeonStyles: String, Identifiable {
            case pulse
            public var id: String {
                return rawValue
            }
        }

        public enum AuraStyles: String, Identifiable {
            case standard
            case blue
            case purple

            public var id: String {
                return rawValue
            }
        }

        public enum CoverStyles: String, Identifiable {
            case image
            case video
            public var id: String {
                return rawValue
            }
        }

        public enum CloudsStyles: String, Identifiable {
            case standard
            public var id: String {
                return rawValue
            }
        }

        public enum GooStyles: String, Identifiable {
            case waves
            public var id: String {
                return rawValue
            }
        }

        public enum GridWarpStyles: String, Identifiable {
            case pink
            case blue
            public var id: String {
                return rawValue
            }
        }

        public enum SpaceStyles: String, Identifiable {
            case rocksV1 = "rocks_v1"

            public var id: String {
                return rawValue
            }
        }

        case aura(AuraStyles)
        case cover(CoverStyles)
        case neon(NeonStyles)
        case clouds(CloudsStyles)
        case goo(GooStyles)
        case gridWarp(GridWarpStyles)
        case space(SpaceStyles)

        public var id: String {
            switch self {
            case .aura(let auraStyles):
                return auraStyles.id
            case .cover(let coverStyles):
                return coverStyles.id
            case .neon(let neonStyles):
                return neonStyles.id
            case .clouds(let cloudsStyles):
                return cloudsStyles.id
            case .goo(let gooStyles):
                return gooStyles.id
            case .gridWarp(let gridWarpStyles):
                return gridWarpStyles.id
            case .space(let spaceStyles):
                return spaceStyles.id
            }
        }
    }

    case coverImage
    case coverVideo

    case auraStandard
    case auraBlue
    case auraPurple

    case neonPulse

    case cloudSky
    case gooWaves
    case gridWarpPink
    case gridWarpBlue
    case spaceRocks

    public var enumPresetID: PresetID {
        switch self {
        case .coverImage, .coverVideo:
            return .cover
        case .auraStandard, .auraBlue, .auraPurple:
            return .aura
        case .neonPulse:
            return .neon
        case .cloudSky:
            return .clouds
        case .gooWaves:
            return .goo
        case .gridWarpBlue, .gridWarpPink:
            return .gridWarp
        case .spaceRocks:
            return .space
        }
    }

    public var enumPresetStyle: PresetStyle {
        switch self {
        case .coverImage:
            return .cover(.image)
        case .coverVideo:
            return .cover(.video)
        case .auraStandard:
            return .aura(.standard)
        case .auraBlue:
            return .aura(.blue)
        case .auraPurple:
            return .aura(.purple)
        case .neonPulse:
            return .neon(.pulse)
        case .cloudSky:
            return .clouds(.standard)
        case .gooWaves:
            return .goo(.waves)
        case .gridWarpBlue:
            return .gridWarp(.blue)
        case .gridWarpPink:
            return .gridWarp(.pink)
        case .spaceRocks:
            return .space(.rocksV1)
        }
    }

    public var presetID: String {
        return enumPresetID.id
    }

    public var presetStyle: String {
        return enumPresetStyle.id
    }
}
