enum BlazeReactThumbnailType: String, Codable {
    case squareIcon = "SquareIcon"
    case verticalTwoByThree = "VerticalTwoByThree"
    case custom = "Custom"
}

enum BlazeReactWidgetItemImagePosition: String, Codable {
    case topStart = "TopStart"
    case topCenter = "TopCenter"
    case topEnd = "TopEnd"
    case centerStart = "CenterStart"
    case center = "Center"
    case centerEnd = "CenterEnd"
    case bottomStart = "BottomStart"
    case bottomCenter = "BottomCenter"
    case bottomEnd = "BottomEnd"
}

enum BlazeReactTextAlign: String, Codable {
    case start = "Start"
    case center = "Center"
    case end = "End"
}

enum BlazeReactBottomComponentsAlignment: String, Codable {
    case relativeToContainer = "RelativeToContainer"
    case relativeToPlayer = "RelativeToPlayer"
    case fitCtaBelowPlayer = "FitCtaBelowPlayer"
}

enum BlazeReactPlayerDisplayMode: String, Codable {
    case fixedRatio_9_16 = "FixedRatio_9_16"
    case resizeAspectFillCenterCrop = "ResizeAspectFillCenterCrop"
}

enum BlazeReactObjectYPosition: String, Codable {
    case bottomToTop = "BottomToTop"
    case topToTop = "TopToTop"
    case bottomToBottom = "BottomToBottom"
    case topToBottom = "TopToBottom"
    case centerToTop = "CenterToTop"
    case centerY = "CenterY"
    case centerToBottom = "CenterToBottom"
}

enum BlazeReactObjectXPosition: String, Codable {
    case leadingToLeading = "LeadingToLeading"
    case leadingToTrailing = "LeadingToTrailing"
    case trailingToLeading = "TrailingToLeading"
    case trailingToTrailing = "TrailingToTrailing"
    case centerX = "CenterX"
    case centerToLeading = "CenterToLeading"
    case centerToTrailing = "CenterToTrailing"
}

struct BlazeReactWidgetItemImageStyle: Codable {
    var position: BlazeReactWidgetItemImagePosition?
    var width: CGFloat?
    var height: CGFloat?
    var ratio: CGFloat?
    var cornerRadius: CGFloat?
    var cornerRadiusRatio: CGFloat?
    var border: BlazeReactWidgetItemImageContainerBorderStyle?
    var thumbnailType: BlazeReactThumbnailType?
    var margins: BlazeReactMargins?
    var animatedThumbnail: BlazeReactWidgetItemAnimatedThumbnailStyle?
    var gradientOverlay: BlazeReactWidgetItemImageGradientOverlayStyle?
}

struct BlazeReactWidgetItemImageGradientOverlayStyle: Codable {
    var isVisible: Bool?
    var position: Position?
    var startColor: String?
    var endColor: String?
    
    enum Position: String, Codable {
        case top = "Top"
        case center = "Center"
        case bottom = "Bottom"
    }
}

struct BlazeReactWidgetItemAnimatedThumbnailStyle: Codable {
    var isEnabled: Bool?
    var horizontalAnimationTriggerPercentage: Double?
}

struct BlazeReactWidgetItemImageContainerBorderStyle: Codable {
    var isVisible: Bool?
    var liveReadState: BlazeReactWidgetItemImageContainerBorderStateStyle?
    var liveUnreadState: BlazeReactWidgetItemImageContainerBorderStateStyle?
    var readState: BlazeReactWidgetItemImageContainerBorderStateStyle?
    var unreadState: BlazeReactWidgetItemImageContainerBorderStateStyle?
}

struct BlazeReactWidgetItemImageContainerBorderStateStyle: Codable {
    var isVisible: Bool?
    var color: String?
    var margin: Double?
    var width: Double?
}

struct BlazeReactWidgetItemTitleStyle: Codable {
    var isVisible: Bool?
    var readState: BlazeReactTitleStyle?
    var unreadState: BlazeReactTitleStyle?
    var position: BlazeReactObjectPositioning?
    var margins: BlazeReactMargins?
}

struct BlazeReactObjectPositioning: Codable {
    var xPosition: BlazeReactObjectXPosition?
    var yPosition: BlazeReactObjectYPosition?
}

struct BlazeReactTitleStyle: Codable {
    var font: BlazeReactTitleFont?
    var textSize: CGFloat?
    var letterSpacing: Double?
    var textColor: String?
    var lineHeight: Double?
    var maxLines: Int?
    var textAlign: BlazeReactTextAlign?
}

struct BlazeReactTitleFont: Codable {
    var fontName: String?
}

struct BlazeReactWidgetItemStyle: Codable {
    var title: BlazeReactWidgetItemTitleStyle?
    var image: BlazeReactWidgetItemImageStyle?
    var backgroundColor: String?
    var cornerRadius: CGFloat?
    var cornerRadiusRatio: CGFloat?
    var margins: BlazeReactMargins?
    var statusIndicator: BlazeReactWidgetItemStatusIndicatorStyle?
    var badge: BlazeReactWidgetItemBadgeStyle?
}


struct BlazeReactWidgetItemBadgeStyle: Codable {
    var isVisible: Bool?
    var position: BlazeReactObjectPositioning?
    var margins: BlazeReactMargins?
    var titlePadding: BlazeReactMargins?
    var liveUnreadState: BlazeReactWidgetItemBadgeStateStyle?
    var liveReadState: BlazeReactWidgetItemBadgeStateStyle?
    var unreadState: BlazeReactWidgetItemBadgeStateStyle?
    var readState: BlazeReactWidgetItemBadgeStateStyle?
}

struct BlazeReactWidgetItemBadgeStateStyle: Codable {
    var width: CGFloat?
    var height: CGFloat?
    var isVisible: Bool?
    var backgroundColor: String?
    var backgroundImage: BlazeReactImage?
    var textStyle: BlazeReactTitleStyle?
    var text: String?
    var cornerRadius: CGFloat?
    var cornerRadiusRatio: CGFloat?
    var borderColor: String?
    var borderWidth: CGFloat?
}

struct BlazeReactWidgetItemStatusIndicatorStyle: Codable {
    var isVisible: Bool?
    var position: BlazeReactObjectPositioning?
    var margins: BlazeReactMargins?
    var statusTitlePadding: BlazeReactMargins?
    var liveUnreadState: BlazeReactWidgetItemStatusIndicatorStateStyle?
    var liveReadState: BlazeReactWidgetItemStatusIndicatorStateStyle?
    var unreadState: BlazeReactWidgetItemStatusIndicatorStateStyle?
    var readState: BlazeReactWidgetItemStatusIndicatorStateStyle?
}

struct BlazeReactWidgetItemStatusIndicatorStateStyle: Codable {
    var isVisible: Bool?
    var backgroundColor: String?
    var backgroundImage: BlazeReactImage?
    var textStyle: BlazeReactTitleStyle?
    var text: String?
    var cornerRadius: CGFloat?
    var cornerRadiusRatio: CGFloat?
    var borderColor: String?
    var borderWidth: CGFloat?
}

struct BlazeReactWidgetLayout: Codable {
    var horizontalItemsSpacing: Double?
    var verticalItemsSpacing: Double?
    var itemRatio: Double?
    var columns: Int?
    var maxDisplayItemsCount: Int?
    var widgetItemStyle: BlazeReactWidgetItemStyle?
    var margins: BlazeReactMargins?
}

struct BlazeReactMargins: Codable{
    var top: CGFloat?
    var leading: CGFloat?
    var bottom: CGFloat?
    var trailing: CGFloat?
}

enum BlazeReactTextCase: String, Codable {
    case uppercase = "Uppercase"
    case lowercase = "Lowercase"
}

struct BlazeReactWidgetItemCustomMapping : Codable, Hashable {
    let key: String
    let value: String
}

struct BlazeReactWidgetStylesOverrides : Codable {
    let statusIndicator: BlazeReactWidgetItemStatusIndicatorStyle?
    let imageBorder: BlazeReactWidgetItemImageContainerBorderStyle?
    var badge: BlazeReactWidgetItemBadgeStyle?
}
struct BlazeReactPlayerButtonCustomImageStates: Codable {
    var selectedImage: BlazeReactImage?
    var unselectedImage: BlazeReactImage?
}

struct BlazeReactImage: Codable {
    var imageName: String?
}

///
/// Story
///

struct BlazeReactStoryPlayerStyle: Codable {
    var title: BlazeReactStoryPlayerTitleTextStyle?
    var lastUpdate: BlazeReactStoryPlayerLastUpdateTextStyle?
    var buttons: BlazeReactStoryPlayerButtonsStyle?
    var chips: BlazeReactStoryPlayerChipsStyle?
    var backgroundColor: String?
    var cta: BlazeReactStoryPlayerCtaStyle?
    var headerGradient: BlazeReactStoryPlayerHeaderGradientStyle?
    var progressBar: BlazeReactStoryPlayerProgressBarStyle?
    var firstTimeSlide: BlazeReactStoryPlayerFirstTimeSlideStyle?
}

struct BlazeReactStoryPlayerTitleTextStyle : Codable {
    var font: BlazeReactTitleFont?
    let textSize: CGFloat? // Only Android
    var textColor: String?
    var isVisible: Bool?
}

struct BlazeReactStoryPlayerLastUpdateTextStyle : Codable {
    var font: BlazeReactTitleFont?
    let textSize: CGFloat? // Only Android
    var textColor: String?
    var textCase: BlazeReactTextCase?
    var isVisible: Bool?
}

struct BlazeReactStoryPlayerButtonsStyle : Codable {
    var mute: BlazeReactStoryPlayerButtonStyle?
    var exit: BlazeReactStoryPlayerButtonStyle?
    var share: BlazeReactStoryPlayerButtonStyle?
}

struct BlazeReactStoryPlayerButtonStyle : Codable {
    var width: CGFloat?
    var height: CGFloat?
    var color: String?
    var isVisible: Bool?
    var isVisibleForAds: Bool?
    var customImage: BlazeReactPlayerButtonCustomImageStates?
}

struct BlazeReactStoryPlayerChipsStyle : Codable {
    var live: BlazeReactStoryPlayerChipStyle?
    var ad: BlazeReactStoryPlayerChipStyle?
}

struct BlazeReactStoryPlayerChipStyle : Codable {
    var titlePadding: BlazeReactMargins?
    var text: String?
    var textColor: String?
    var backgroundColor: String?
    var isVisible: Bool?
}

struct BlazeReactStoryPlayerCtaStyle : Codable {
    let cornerRadius: CGFloat?
    let font: BlazeReactTitleFont?
    let textSize: CGFloat? // Only Android
}

struct BlazeReactStoryPlayerHeaderGradientStyle : Codable {
    var isVisible: Bool?
    var startColor: String?
    var endColor: String?
}

struct BlazeReactStoryPlayerProgressBarStyle: Codable {
    var backgroundColor: String?
    var progressColor: String?
}

struct BlazeReactStoryPlayerFirstTimeSlideStyle: Codable {
    var show: Bool?
    var cta: BlazeReactFirstTimeSlideCTAStyle?
    var backgroundColor: BlazeReactColor?
    var mainTitle: BlazeReactFirstTimeSlideTextStyle?
    var subtitle: BlazeReactFirstTimeSlideTextStyle?
    var instructions: BlazeReactStoryPlayerFirstTimeSlideInstructionsStyle?
}

struct BlazeReactStoryPlayerFirstTimeSlideInstructionsStyle: Codable{
    var forward: BlazeReactFirstTimeSlideInstructionStyle?
    var pause: BlazeReactFirstTimeSlideInstructionStyle?
    var backward: BlazeReactFirstTimeSlideInstructionStyle?
    var transition: BlazeReactFirstTimeSlideInstructionStyle?
}

///
/// First Time Slide Shared
///

struct BlazeReactFirstTimeSlideInstructionStyle: Codable {
    var headerText: BlazeReactFirstTimeSlideTextStyle?
    var descriptionText: BlazeReactFirstTimeSlideTextStyle?
}

struct BlazeReactFirstTimeSlideCTAStyle: Codable {
    var title: String?
    var backgroundColor: BlazeReactColor?
    var textColor: BlazeReactColor?
    var font: BlazeReactTitleFont?
    var cornerRadius: CGFloat?
    let textSize: CGFloat? // Only Android
}

struct BlazeReactFirstTimeSlideTextStyle: Codable {
    let text: String?
    let font: BlazeReactTitleFont?
    let textSize: CGFloat? // Only Android
    let textColor: BlazeReactColor?
}

///
/// Moments
///

struct BlazeReactMomentsPlayerStyle: Codable {
    var headingText: BlazeReactMomentsPlayerHeadingTextStyle?
    var bodyText: BlazeReactMomentsPlayerBodyTextStyle?
    var buttons: BlazeReactMomentsPlayerButtonsStyle?
    var chips: BlazeReactMomentsPlayerChipsStyle?
    var backgroundColor: String?
    var cta: BlazeReactMomentsPlayerCtaStyle?
    var headerGradient: BlazeReactMomentsPlayerHeaderGradientStyle?
    var footerGradient: BlazeReactMomentsPlayerFooterGradientStyle?
    var firstTimeSlide: BlazeReactMomentsPlayerFirstTimeSlideStyle?
    let seekBar: BlazeReactMomentsPlayerSeekBarStyle?
    var bottomComponentsAlignment: BlazeReactBottomComponentsAlignment?
    var playerDisplayMode: BlazeReactPlayerDisplayMode?
}

struct BlazeReactMomentsPlayerHeadingTextStyle: Codable {
    var textSize: CGFloat? // Only Android
    var font: BlazeReactTitleFont?
    var textColor: String?
    var contentSource: ContentSource?
    var isVisible: Bool?
    
    enum ContentSource: String, Codable {
        case title = "Title"
        case subtitle = "Subtitle"
    }
}

struct BlazeReactMomentsPlayerBodyTextStyle: Codable {
    var textSize: CGFloat?
    var font: BlazeReactTitleFont?
    var textColor: String?
    var contentSource: ContentSource?
    var isVisible: Bool?
    
    enum ContentSource: String, Codable {
        case title = "Title"
        case subtitle = "Subtitle"
        case description = "Description"
    }
}

struct BlazeReactMomentsPlayerButtonsStyle: Codable {
    var mute: BlazeReactMomentsPlayerButtonStyle?
    var exit: BlazeReactMomentsPlayerButtonStyle?
    var share: BlazeReactMomentsPlayerButtonStyle?
    var like: BlazeReactMomentsPlayerButtonStyle?
    var play: BlazeReactMomentsPlayerButtonStyle?
}

struct BlazeReactMomentsPlayerButtonStyle: Codable {
    var width: CGFloat?
    var height: CGFloat?
    var color: String?
    var isVisible: Bool?
    var isVisibleForAds: Bool?
    var customImage: BlazeReactPlayerButtonCustomImageStates?
}

struct BlazeReactMomentsPlayerChipsStyle: Codable {
    var ad: BlazeReactMomentsPlayerChipStyle?
}

struct BlazeReactMomentsPlayerChipStyle: Codable {
    var titlePadding: BlazeReactMargins?
    var text: String?
    var textColor: String?
    var backgroundColor: String?
    var isVisible: Bool?
}

struct BlazeReactMomentsPlayerCtaStyle: Codable {
    var cornerRadius: CGFloat?
    var width: CGFloat?
    var height: CGFloat?
    var font: BlazeReactTitleFont?
    var textSize: CGFloat? // Only for Android
    var layoutPositioning: CTAPositioning?
    var icon: BlazeReactMomentCtaIcon?
    var horizontalAlignment: CTAHorizontalAlignment?
    
    enum CTAPositioning: String, Codable {
        case bellowBottomButtonsBox = "CtaBellowBottomButtonsBox"
        case nextToBottomButtonsBox = "CtaNextToBottomButtonsBox"
    }
    
    enum CTAHorizontalAlignment: String, Codable {
        case start = "Start"
        case center = "Center"
        case end = "End"
        case fullAvailableWidth = "FullAvailableWidth"
    }
}

struct BlazeReactMomentsPlayerHeaderGradientStyle : Codable {
    var isVisible: Bool?
    var startColor: String?
    var endColor: String?
}

struct BlazeReactMomentsPlayerFooterGradientStyle : Codable {
    var isVisible: Bool?
    var startColor: String?
    var endColor: String?
    var endPositioning: EndPositioning?
    
    enum EndPositioning: String, Codable {
        case bottomToPlayer = "BottomToPlayer"
        case bottomToContainer = "BottomToContainer"
    }
}

struct BlazeReactMomentsPlayerFirstTimeSlideStyle: Codable {
    var show: Bool?
    var cta: BlazeReactFirstTimeSlideCTAStyle?
    var backgroundColor: BlazeReactColor?
    var mainTitle: BlazeReactFirstTimeSlideTextStyle?
    var subtitle: BlazeReactFirstTimeSlideTextStyle?
    var instructions: BlazeReactMomentsPlayerFirstTimeSlideInstructionsStyle?
}

struct BlazeReactMomentsPlayerFirstTimeSlideInstructionsStyle: Codable{
    var next: BlazeReactFirstTimeSlideInstructionStyle?
    var previous: BlazeReactFirstTimeSlideInstructionStyle?
    var pause: BlazeReactFirstTimeSlideInstructionStyle?
    var play: BlazeReactFirstTimeSlideInstructionStyle?
}

struct BlazeReactMomentsPlayerSeekBarStyle: Codable {
    let isVisible: Bool?
    let playingState: BlazeReactSeekBarStyle?
    let pausedState: BlazeReactSeekBarStyle?
    let horizontalSpacing: CGFloat?
    let bottomSpacing: CGFloat?
}

struct BlazeReactSeekBarStyle: Codable {
    let isVisible: Bool?
    let backgroundColor: String?
    let progressColor: String?
    let height: CGFloat?
    let cornerRadius: CGFloat?
    let thumbColor: String?
    let thumbImage: BlazeReactImage?
    let thumbSize: CGFloat?
    let isThumbVisible: Bool?
}

struct BlazeReactMomentCtaIcon: Codable {
    var iconImage: BlazeReactImage?
}

struct BlazeReactColor: Codable {
    var colorName: String?
    var colorFileName: String?
}
