#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

void (*gSuspendCallback)(bool suspend);
bool gIsSuspended = false;

extern "C" void RegisterSuspendCallback(void (*callback)(bool))
{
    if (!gSuspendCallback)
    {
        gSuspendCallback = callback;
        
        [[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionInterruptionNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
        {
            bool began = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue] == AVAudioSessionInterruptionTypeBegan;
            
            if (began == gIsSuspended)
            {
                return;
            }
            if (@available(iOS 10.3, *))
            {
                if (began && [[notification.userInfo valueForKey:AVAudioSessionInterruptionWasSuspendedKey] boolValue])
                {
                    return;
                }
            }
            
            gIsSuspended = began;
            if (!began)
            {
                [[AVAudioSession sharedInstance] setActive:TRUE error:nil];
            }
            if (gSuspendCallback)
            {
                gSuspendCallback(began);
            }
        }];
        
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
        {
#ifndef TARGET_OS_TV
            if (!gIsSuspended)
            {
                return;
            }
#else
            if (gSuspendCallback)
            {
                gSuspendCallback(true);
            }
#endif
            [[AVAudioSession sharedInstance] setActive:TRUE error:nil];
            if (gSuspendCallback)
            {
                gSuspendCallback(false);
            }
            gIsSuspended = false;
        }];
    }
}
