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

import Foundation
import BlazeSDK

extension BlazeTextCase {
    func mergedWith(_ customization: BlazeReactTextCase?) -> Self {
        guard let customization else { return self }
        
        switch customization {
        case .uppercase:
            return .uppercase
        case .lowercase:
            return .lowercase
        }
    }
}

extension NSTextAlignment {
    func mergedWith(_ customization: BlazeReactTextAlign?) -> Self {
        guard let customization else { return self }
        
        let result: NSTextAlignment
        switch customization {
            
        case .start:
            result = .left
        case .center:
            result = .center
        case .end:
            result = .right
        }
        
        return result
    }
}

extension NSDirectionalEdgeInsets {
    func mergedWith(_ customization: BlazeReactMargins?) -> Self {
        guard let customization else { return self }

        let result = NSDirectionalEdgeInsets(top: customization.top ?? top, leading: customization.leading ?? leading, bottom: customization.bottom ?? bottom, trailing: customization.trailing ?? trailing)

        return result
    }
}

extension UIFont {
    func fontWith(_ customization: BlazeReactTitleFont?,
                  textSize: CGFloat?) -> UIFont {
        var size = pointSize // Default size is current size.
        if let textSize {
            size = textSize
        }
        
        guard let fontName = customization?.fontName else {
            return self.withSize(size)
        }
        
        return UIFont(name: fontName, size: size) ?? self
    }
}

extension UIImage {
    
    static func imageWith(_ customization: BlazeReactImage?) -> UIImage? {
        guard let imageName = customization?.imageName else { return nil }
        
        return UIImage(named: imageName)
    }
    
}

extension BlazeSeekBarStyle {
    func mergedWith(_ customization: BlazeReactSeekBarStyle?) -> Self {
        guard let customization else { return self }
        
        var merged = self
        merged.isVisible = customization.isVisible ?? merged.isVisible
        merged.backgroundColor = UIColor(hexString: customization.backgroundColor) ?? merged.backgroundColor
        merged.progressColor = UIColor(hexString: customization.progressColor) ?? merged.progressColor
        merged.height = customization.height ?? merged.height
        merged.cornerRadius = customization.cornerRadius ?? merged.cornerRadius
        merged.thumbColor = UIColor(hexString: customization.thumbColor) ?? merged.thumbColor
        merged.thumbImage = UIImage.imageWith(customization.thumbImage) ?? merged.thumbImage
        merged.thumbSize = customization.thumbSize ?? merged.thumbSize
        merged.isThumbVisible = customization.isThumbVisible ?? merged.isThumbVisible
        return merged
    }
}

extension BlazeReactCustomActionButton {
    func toNativeStoryCustomActionButton() -> BlazeStoryPlayerCustomActionButton? {
        guard let customParams else { return nil }
        
        let parsedVisibilityCondition = customParams.visibilityCondition.flatMap {
            BlazePlayerCustomActionButtonParams.VisibilityCondition.from(dictionary: $0.anyHashableDict)
        }
        let params = BlazePlayerCustomActionButtonParams(
            id: customParams.id,
            appMetadata: customParams.appMetadata?.anyHashableDict ?? [:],
            name: customParams.name,
            visibilityCondition: parsedVisibilityCondition
        )
        
        var button = BlazeStoryPlayerCustomActionButton(customParams: params)
        if let style {
            let storyButtonStyle = BlazeReactStoryPlayerButtonStyle(
                width: style.width,
                height: style.height,
                color: style.color,
                isVisible: style.isVisible,
                isVisibleForAds: style.isVisibleForAds,
                customImage: style.customImage
            )
            button.style = button.style.mergedWith(storyButtonStyle)
        }
        return button
    }
    
    func toNativeMomentsCustomActionButton() -> BlazeMomentsPlayerCustomActionButton? {
        guard let customParams else { return nil }
        
        let parsedVisibilityCondition = customParams.visibilityCondition.flatMap {
            BlazePlayerCustomActionButtonParams.VisibilityCondition.from(dictionary: $0.anyHashableDict)
        }
        let params = BlazePlayerCustomActionButtonParams(
            id: customParams.id,
            appMetadata: customParams.appMetadata?.anyHashableDict ?? [:],
            name: customParams.name,
            visibilityCondition: parsedVisibilityCondition
        )
        
        var button = BlazeMomentsPlayerCustomActionButton(customParams: params)
        button.style = button.style.mergedWith(style)
        return button
    }
}
