#import "ReactNativeAppExit.h"

#if __has_include(<React/RCTReloadCommand.h>)
#import <React/RCTReloadCommand.h>
#define SP_HAS_RCT_RELOAD_COMMAND 1
#else
#define SP_HAS_RCT_RELOAD_COMMAND 0
#endif

@implementation ReactNativeAppExit

RCT_EXPORT_MODULE(ReactNativeAppExit);

@synthesize bridge = _bridge;

+ (BOOL)requiresMainQueueSetup
{
    return NO;
}

#pragma mark - Exit App

// Force-closes the application.
// Note: Apple discourages programmatically exiting in production apps.
RCT_EXPORT_METHOD(exitApp)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        exit(0);
    });
}

#pragma mark - Restart App

// Reloads the React Native runtime.
// Strategy:
// 1) RCTTriggerReloadCommandListeners (RN 0.62+)
// 2) Notification-based reload (older architectures)
// 3) Bridge DevSettings / bridge.reload fallback
RCT_EXPORT_METHOD(restartApp)
{
    dispatch_async(dispatch_get_main_queue(), ^{
#if SP_HAS_RCT_RELOAD_COMMAND
        RCTTriggerReloadCommandListeners(@"@sekizlipenguen/react-native-app-exit");
#else
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center postNotificationName:@"RCTTriggerReloadCommandNotification" object:nil];
        [center postNotificationName:@"RCTReloadNotification" object:nil];

        if (self.bridge != nil) {
            id devSettings = [self.bridge moduleForName:@"DevSettings"];
            if (devSettings != nil && [devSettings respondsToSelector:@selector(reload)]) {
                [devSettings reload];
                return;
            }

            if ([self.bridge respondsToSelector:@selector(reload)]) {
                [self.bridge reload];
            }
        }
#endif
    });
}

@end
