#include <stdio.h>
#include <stdlib.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/pwr_mgt/IOPMLib.h>

int main( int argc, char * argv[] )
{
	CFGregorianDate gregorianDate;
	gregorianDate.year = 2009;
	gregorianDate.month = 12;
	gregorianDate.day = 1;
	gregorianDate.hour = 10;
	gregorianDate.minute = 0;
	gregorianDate.second = 0;
	
	CFTimeZoneRef timeZone = CFTimeZoneCopySystem();
	
	// I use two different times to avoid a bug in IOPMCancelScheduledPowerEvent()
	// when multiple apps have a scheduled wakeup at the same time.
	// Fix that too!
	CFAbsoluteTime timeLowercase = CFGregorianDateGetAbsoluteTime( gregorianDate, timeZone );
	
	gregorianDate.hour = 11;
	CFAbsoluteTime timeUppercase = CFGregorianDateGetAbsoluteTime( gregorianDate, timeZone );
	
	CFDateRef dateLowercase = CFDateCreate( kCFAllocatorDefault, timeLowercase );
	if ( dateLowercase == NULL )
	{
		printf( "lowercase CFDateCreate() returned NULL\n" );
		return EXIT_FAILURE;
	}
	CFDateRef dateUppercase = CFDateCreate( kCFAllocatorDefault, timeUppercase );
	if ( dateUppercase == NULL )
	{
		printf( "uppercase CFDateCreate() returned NULL\n" );
		return EXIT_FAILURE;
	}
	
	CFStringRef wake = CFSTR( "wake" );
	
	IOReturn error = IOPMSchedulePowerEvent( dateLowercase, CFSTR( "com.test.lowercaseapp" ), wake );
	if ( error != kIOReturnSuccess )
	{
		printf( "lowercase IOPMSchedulePowerEvent() returned %i\n", error );
		return EXIT_FAILURE;
	}
	
	error = IOPMSchedulePowerEvent( dateUppercase, CFSTR( "com.test.UppercaseApp" ), wake );
	if ( error != kIOReturnSuccess )
	{
		printf( "uppercase IOPMSchedulePowerEvent() returned %i\n", error );
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
