//
//  RCTConvert+FireworkSdk.swift
//  react-native-firework-sdk
//
//  Created by Jeff on 2021/12/20.
//

import FireworkVideo
import Foundation
import UIKit

extension RCTConvert {
    static func videoPlayerStyle(_ style: String?) -> VideoPlayerContentConfiguration
        .VideoPlayerStyle? {
        guard let rStyle = style else {
            return nil
        }
        if rStyle == "fit" {
            return .fit
        } else {
            return .fullBleed
        }
    }

    static func videoCompleteAction(_ action: String?) -> VideoPlayerContentConfiguration
        .VideoCompleteAction? {
        guard let action = action else {
            return nil
        }
        if action == "loop" {
            return .loop
        } else {
            return .advanceToNext
        }
    }

    static func ctaButtonStyle(_ style: [String: AnyObject]?) -> ButtonContentConfiguration? {
        guard let rStyle = style else {
            return nil
        }
        var btnContentConfig = ButtonContentConfiguration()
        if let backgroundColor = rStyle["backgroundColor"] as? String, let color = backgroundColor.uicolor() {
            btnContentConfig.backgroundColor = color
        }
        if let textColor = rStyle["textColor"] as? String, let color = textColor.uicolor() {
            btnContentConfig.textColor = color
        }
        if let fontSize = rStyle["fontSize"] as? Double {
            btnContentConfig.font = UIFont.systemFont(ofSize: fontSize)
        }

        return btnContentConfig
    }

    static func adBadgeConfiguration(_ config: [String: Any]?) -> AdBadgeConfiguration? {
        guard let rConfig = config else {
            return nil
        }

        let jsonData = try? JSONSerialization.data(withJSONObject: rConfig, options: .prettyPrinted)
        guard let rJsonData = jsonData else {
            return nil
        }

        var result: AdBadgeConfiguration?
        do {
            result = try JSONDecoder().decode(AdBadgeConfiguration.self, from: rJsonData)
        } catch let error {
            print(error.localizedDescription)
        }

        return result
    }

    static func trackPurchaseParameters(_ parameters: [String: Any]?)
        -> TrackPurchaseParameters? {
        guard let rParameters = parameters else {
            return nil
        }

        let jsonData = try? JSONSerialization.data(
            withJSONObject: rParameters, options: .prettyPrinted)
        guard let rJsonData = jsonData else {
            return nil
        }

        var result: TrackPurchaseParameters?
        do {
            result = try JSONDecoder().decode(TrackPurchaseParameters.self, from: rJsonData)
        } catch let error {
            print(error.localizedDescription)
        }

        return result
    }

    static func sdkInitOptions(_ options: [String: Any]?) -> SDKInitOptions? {
        guard let rOptions = options else {
            return nil
        }

        let jsonData = try? JSONSerialization.data(withJSONObject: rOptions, options: .prettyPrinted)
        guard let rJsonData = jsonData else {
            return nil
        }

        var result: SDKInitOptions?
        do {
            result = try JSONDecoder().decode(SDKInitOptions.self, from: rJsonData)
        } catch let error {
            print(error.localizedDescription)
        }

        return result
    }

    static func dataTrackingLevel(_ level: String) -> FireworkVideo.DataTrackingLevel? {
        switch level {
        case "all":
            return FireworkVideo.DataTrackingLevel.all
        case "essentialOnly":
            return FireworkVideo.DataTrackingLevel.essentialOnly
        case "none":
            return FireworkVideo.DataTrackingLevel.none
        default:
            return nil
        }
    }

    static func livestreamPlayerDesignVersion(
        _ version: String
    ) -> FireworkVideo.LivestreamPlayerDesignVersion? {
        switch version {
        case "v1":
            return FireworkVideo.LivestreamPlayerDesignVersion.v1
        case "v2":
            return FireworkVideo.LivestreamPlayerDesignVersion.v2
        default:
            return nil
        }
    }

    static func shortVideoPlayerDesignVersion(
        _ version: String
    ) -> FireworkVideo.ShortVideoPlayerDesignVersion? {
        switch version {
        case "v1":
            return FireworkVideo.ShortVideoPlayerDesignVersion.v1
        case "v2":
            return FireworkVideo.ShortVideoPlayerDesignVersion.v2
        default:
            return nil
        }
    }
}
