//
//  StoryBlockManager.m
//  react-native-firework-sdk
//
//  Created by linjie jiang on 2022/8/11.
//

#import <React/RCTBridgeModule.h>
#import <React/RCTViewManager.h>
#import <React/RCTUIManager.h>

#if __has_include(<react_native_firework_sdk/react_native_firework_sdk-Swift.h>)
#import <react_native_firework_sdk/react_native_firework_sdk-Swift.h>
#else
#import "react_native_firework_sdk-Swift.h"
#endif


@interface RCT_EXTERN_REMAP_MODULE(FWStoryBlock, FWStoryBlockManager, NSObject)

RCT_CUSTOM_VIEW_PROPERTY(source, StoryBlockSource, StoryBlock) {
    if (json) {
        StoryBlockSourceType sourceType = [RCTConvert storyBlockSourceType: json];
        view.sourceType = sourceType;
    }
}
RCT_EXPORT_VIEW_PROPERTY(channel, NSString)
RCT_EXPORT_VIEW_PROPERTY(playlist, NSString)
RCT_EXPORT_VIEW_PROPERTY(dynamicContentParameters, NSDictionary)
RCT_EXPORT_VIEW_PROPERTY(hashtagFilterExpression, NSString)
RCT_EXPORT_VIEW_PROPERTY(productIds, NSArray)
RCT_EXPORT_VIEW_PROPERTY(contentId, NSString)

RCT_CUSTOM_VIEW_PROPERTY(adConfiguration, AdConfiguration, StoryBlock) {
    AdConfiguration *config = [RCTConvert adConfiguration:json];
    view.adConfiguration = config;
}

RCT_CUSTOM_VIEW_PROPERTY(storyBlockConfiguration, StoryBlockConfiguration, StoryBlock) {
    StoryBlockConfiguration *config = [RCTConvert storyBlockConfiguration:json];
    view.storyBlockConfiguration = config;
}

RCT_EXPORT_VIEW_PROPERTY(onStoryBlockLoadFinished, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onStoryBlockEmpty, RCTBubblingEventBlock)

RCT_EXPORT_VIEW_PROPERTY(onStoryBlockDidStartPictureInPicture, RCTBubblingEventBlock)

RCT_EXPORT_VIEW_PROPERTY(onStoryBlockDidStopPictureInPicture, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onStoryBlockGetFeedId, RCTBubblingEventBlock)

RCT_EXPORT_METHOD(play:(nonnull NSNumber *)reactTag) {
    [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
        StoryBlock *view = (StoryBlock *)(viewRegistry[reactTag]);
        if (!view || ![view isKindOfClass:[StoryBlock class]]) {
            RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
            return;
        }
        [view play];
    }];
}

RCT_EXPORT_METHOD(pause:(nonnull NSNumber *)reactTag) {
    [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
        StoryBlock *view = (StoryBlock *)(viewRegistry[reactTag]);
        if (!view || ![view isKindOfClass:[StoryBlock class]]) {
            RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
            return;
        }
        [view pause];
    }];
}

RCT_EXPORT_METHOD(onViewportEntered:(nonnull NSNumber *)reactTag) {
    [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
        StoryBlock *view = (StoryBlock *)(viewRegistry[reactTag]);
        if (!view || ![view isKindOfClass:[StoryBlock class]]) {
            RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
            return;
        }
        [view onViewportEntered];
    }];
}

RCT_EXPORT_METHOD(onViewportLeft:(nonnull NSNumber *)reactTag) {
    [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
        StoryBlock *view = (StoryBlock *)(viewRegistry[reactTag]);
        if (!view || ![view isKindOfClass:[StoryBlock class]]) {
            RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
            return;
        }
        [view onViewportLeft];
    }];
}

RCT_EXPORT_METHOD(openFullscreen:(nonnull NSNumber *)reactTag) {
    [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
        StoryBlock *view = (StoryBlock *)(viewRegistry[reactTag]);
        if (!view || ![view isKindOfClass:[StoryBlock class]]) {
            RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
            return;
        }
        [view openFullscreen];
    }];
}

@end

