/**
 * @file pctl.h
 * @brief Parental Controls service IPC wrapper.
 * @author yellows8
 * @copyright libnx Authors
 */

#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"

typedef struct {
    u8 rating_age;
    bool sns_post_restriction;
    bool free_communication_restriction;
} PctlRestrictionSettings;

/// Initialize pctl.
Result pctlInitialize(void);

/// Exit pctl.
void pctlExit(void);

/// Gets the Service object for the actual pctl service session.
Service* pctlGetServiceSession(void);

/// Gets the Service object for IParentalControlService.
Service* pctlGetServiceSession_Service(void);

/// Gets whether Parental Controls restrictions are temporarily unlocked.
Result pctlIsRestrictionTemporaryUnlocked(bool *flag);

/// Confirm whether VrMode is allowed. Only available with [4.0.0+].
Result pctlConfirmStereoVisionPermission(void);

/// Gets whether Parental Controls are enabled.
Result pctlIsRestrictionEnabled(bool *flag);

/// Gets whether Parental Controls are enabled.
Result pctlGetSafetyLevel(u32 *safety_level);

/// Returns the current restrictions settings.
Result pctlGetCurrentSettings(PctlRestrictionSettings *settings);

/// Gets the count of applications that have free communication.
Result pctlGetFreeCommunicationApplicationListCount(u32 *count);

/// Reset the confirmation done by \ref pctlConfirmStereoVisionPermission. Only available with [5.0.0+].
Result pctlResetConfirmedStereoVisionPermission(void);

/// Gets whether VrMode is allowed. Only available with [5.0.0+].
Result pctlIsStereoVisionPermitted(bool *flag);

/// Confirm whether pairing is active.
Result pctlIsPairingActive(bool *flag);

/// Returns the synchronization event.
Result pctlGetSynchronizationEvent(Event* out_event);

/// Returns the supension event.
Result pctlGetPlayTimerEventToRequestSuspension(Event* out_event);

/// Confirm whether play timer alarm is disabled. Only available with [4.0.0+].
Result pctlIsPlayTimerAlarmDisabled(bool *flag);

/// Returns the unlinked event.
Result pctlGetUnlinkedEvent(Event* out_event);