//
//  BlazeReactMomentsPlayerStyle.swift
//  Pods
//
//  Created by Reuven Levitsky on 18/05/2025.
//

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?
    var followEntity: BlazeReactMomentsPlayerFollowEntityStyle?
}

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: BlazeReactPlayerButtonStyle?
    var exit: BlazeReactPlayerButtonStyle?
    var share: BlazeReactPlayerButtonStyle?
    var like: BlazeReactPlayerButtonStyle?
    var play: BlazeReactPlayerButtonStyle?
    var seekForward: BlazeReactPlayerButtonStyle?
    var seekBackward: BlazeReactPlayerButtonStyle?
    var search: BlazeReactPlayerButtonStyle?
    var customActionButtons: [BlazeReactCustomActionButton]?
}

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?
    var isVisible: Bool?
    
    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 BlazeReactMomentCtaIcon: Codable {
    var iconImage: BlazeReactImage?
}

struct BlazeReactMomentsPlayerFollowEntityStyle: Codable {
    var isVisible: Bool?
    var followState: BlazeReactMomentsPlayerFollowEntityStateStyle?
    var unfollowState: BlazeReactMomentsPlayerFollowEntityStateStyle?
    var entityType: BlazeReactFollowEntityType?
}

struct BlazeReactMomentsPlayerFollowEntityStateStyle: Codable {
    var avatar: BlazeReactMomentsPlayerFollowEntityAvatarStyle?
    var chip: BlazeReactMomentsPlayerFollowEntityChipStyle?
}

struct BlazeReactMomentsPlayerFollowEntityAvatarStyle: Codable {
    var borderWidth: CGFloat?
    var borderColor: String?
}

struct BlazeReactMomentsPlayerFollowEntityChipStyle: Codable {
    var backgroundColor: String?
    var iconColor: String?
    var contentSource: ContentSource?
    
    enum ContentSource: String, Codable {
        case icon = "Icon"
        case text = "Text"
    }
}

class BlazeReactFollowEntityType: Codable {
    var type: EntityType?
    var fallbackType: BlazeReactFollowEntityType?
    
    enum EntityType: String, Codable {
        case firstAvailable = "FirstAvailable"
        case player = "Player"
        case team = "Team"
        case property = "Property"
    }
}
