#include<stdio.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/stat.h>
#include <net/if.h>
#include <net/if_dl.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>
#import <mach/mach.h>
#import <mach/mach_host.h>
#import <sys/types.h>
#import <sys/param.h>
#import <sys/mount.h>
#import <mach/processor_info.h>
//#import "VPViewController.h"
#include <iostream.h>
#include <string>

float get_battery_level()
{
	[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
	float batteryLevel = [[UIDevice currentDevice] batteryLevel];

	return batteryLevel;
}

/*
extern "C" const char*  get_model();           // 手机型号
extern "C" const char*  get_imsi();           // imsi
extern "C" const char*  get_number();         // 手机号
extern "C" const char*  get_simOperator();    // 运营商
extern "C" double  		get_maxRAM();           // 手机最大RAM
extern "C" const char*  get_cpuName();        // 手机CPU型号
extern "C" const char*  get_cpuFrequency();   // 手机CPU频率
extern "C" int  get_cpuCores();          // 手机CPU个数
*/
extern "C" const char*  get_model()          // 手机型号
{
	char* buf = new char[64];
	const char* model = [[UIDevice currentDevice].model UTF8String];
    memcpy(buf, model, strlen(model));
	return buf;
}

//warning, private framework, comment in platform AppStore
#ifndef PLATFORM_APPSTORE
//extern NSString * CTSIMSupportCopyMobileSubscriberIdentity();
#endif
extern "C" const char*  get_imsi()         // imsi
{
	char* buf = new char[64];
	memset(buf, 0, 64);
	#ifndef PLATFORM_APPSTORE
	// maybe null 
    NSString* data = nil;//CTSIMSupportCopyMobileSubscriberIdentity();
	if (data)
	{
		const char* var = [data UTF8String];
		memcpy(buf, var, strlen(var));
	}		
	#endif
	
	return buf;
}

//warning, private framework, comment in platform AppStore
#ifndef PLATFORM_APPSTORE
//extern NSString *CTSettingCopyMyPhoneNumber();
#endif
extern "C" const char*  get_number()         // 手机号
{
	char* buf = new char[64];
	memset(buf, 0, 64);	
	#ifndef PLATFORM_APPSTORE
	// maybe null 
    NSString* number = nil;//CTSettingCopyMyPhoneNumber();
	if (number)
	{
		const char* var = [number UTF8String];
		memcpy(buf, var, strlen(var));
	}		
	#endif
	return buf;
}

extern "C" const char*  get_simOperator()    // 运营商
{
	char* buf = new char[64];
	memset(buf, 0, 64);

	// 
	CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
	CTCarrier *carrier = [info subscriberCellularProvider];
	if (carrier != nil) {
		NSString *carrierName = [carrier carrierName];			
		if (carrierName != nil)
		{
			const char* var = [carrierName UTF8String];
			memcpy(buf, var, strlen(var));
		}
	}
	return buf;
}

extern "C" const char*  get_cpuName()        // 手机CPU型号
{
	char* buf = new char[64];
	memset(buf, 0, 64);
	
	/*
	NSString* cpu = get_cpu_type();
	const char* var = [cpu UTF8String];
	memcpy(buf, var, strlen(var));
	*/
	return buf;
}

extern "C" const char*  get_cpuFrequency()   // 手机CPU频率
{
	char* buf = new char[64];
	memset(buf, 0, 64);
	
	int result;
	int mib[2];
	mib[0] = CTL_HW;
	mib[1] = HW_CPU_FREQ;
	size_t length = sizeof(result);

    //int	sysctl(int *, u_int, void *, size_t *, void *, size_t);
    if (sysctl(mib, 2, (void*)&result, &length, NULL, 0) < 0)
	{
		perror("getting cpu frequency");
	}
	sprintf(buf, "%d", result);
	
	return buf;
}

extern "C" int  get_cpuCores()          // 手机CPU个数
{
	unsigned int ncpu;  
    size_t len = sizeof(ncpu);  
    sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);  
      
    return (int)ncpu;  
}

// photo
/*
*等图片ok,回调 ProgramRoot的NotifyChoosedPhoto(string photoPaht)
*/
extern void startChooseImage(const char* fileName, float width, float height);
std::string photoPath = "";
void chooseImageFinish(const char *fileName)
{
    NSString* path = [NSString stringWithUTF8String:fileName];
    NSRange range = [path rangeOfString:@"." options:NSBackwardsSearch];
    if (range.length > 0)
        path = [path substringToIndex:range.location];
    
    if ([path compare:[NSString stringWithUTF8String:photoPath.c_str()]] != NSOrderedSame)
        NSLog(@"diff path");
    
    NSLog(@"Prepare image %@", path);
    UnitySendMessage("ProgramRoot", "NotifyChoosedPhoto", path.UTF8String);
}

extern "C" void get_photo(int width, int height, const char* saveFilePath)
{
//    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    NSString* doc = [paths objectAtIndex:0];
//    NSString* path = [doc stringByAppendingPathComponent:@"photo"];
    photoPath = saveFilePath;
    NSLog(@"path %s", saveFilePath);
//    startChooseImage(saveFilePath, width, height);
}

extern "C" void open_url(const char* url)
{
	[[UIApplication sharedApplication]openURL:[NSURL URLWithString:[NSString stringWithUTF8String:url]]];
}

// c interface
extern "C"
{
    // s talking data
    extern "C" void InitTalkingData( const char* appId, const char* partnerId );
    extern "C" void tdgaSetAccount( const char* accountId );
    extern "C" void tdgaSetAccountType(int accountType);
    extern "C" void tdgaSetGender( int  gender);
    extern "C" void tdgaSetAge(int age);
    extern "C" void tdgaSetAccountName( const char* name );
    extern "C" void tdgaSetLevel( int level );
    extern "C" void tdgaSetGameServer( const char* gameServer );
    extern "C" void tdgaOnPurchase( const char* item, int itemNumber, double priceInVirtualCurrency );
    extern "C" void tdgaOnUse( const char* item, int itemNumber );
    extern "C" void tdgaOnBegin( const char* missionId );
    extern "C" void tdgaOnCompleted( const char* missionId );
    extern "C" void tdgaOnFailed( const char* missionId, const char* cause );
    extern "C" void tdgaOnEvent( const char* eventId, const char* jsonEventData );
    extern "C" void tdgaOnReward( double virtualCurrencyAmount, const char* reason );
    
    // sdk
    extern "C" void init_platform_sdk();
	extern "C" void set_appversion(const char* ver);
	extern "C" void set_platform_id(int fgi);
	extern "C" void set_platform_type(const char* ptype);
    extern "C" void testin_Init (const char* appId, const char* channel);
    extern "C" void testin_SetUserInfo (const char* userInfo);
    extern "C" void testin_SetChannel (const char* channel);
    extern "C" void testin_ReportCustomizedException (int type, const char* reason, const char* stackTrace);
    
    void init_sdk(const char* appVer, const char* platformType, int fgi)
    {
//		set_appversion( appVer );
//		set_platform_id( fgi );
//		set_platform_type( platformType );
//
//        init_platform_sdk();
    }
	
	/* void testinInit (const char* appId, const char* channel)
	{
        testin_Init(appId, channel);
	}
	
	void testinSetUserInfo (const char* userInfo)
	{
        testin_SetUserInfo(userInfo);
	}
	 */
	void testinSetChannel (const char* channel)
	{
        //testin_SetChannel(channel);
	}

	/* void testinReportCustomizedException (int type, const char* reason, const char* stackTrace)
	{
        testin_ReportCustomizedException(type, reason, stackTrace);
	} */
	
	float get_battery_remain()
	{
		return get_battery_level();
	}
	
	// s talking data
	void c_InitTalkingData( const char* appId, const char* partnerId )
	{
        InitTalkingData(appId, partnerId);
	}
	
	void c_tdgaSetAccount( const char* accountId )	
	{
        tdgaSetAccount(accountId);
	}
	
    void c_tdgaSetAccountType(int accountType)
    {
        tdgaSetAccountType(accountType);
    }
    
    void c_tdgaSetGender( int  gender)
    {
        tdgaSetGender(gender);
    }
    
    void c_tdgaSetAge(int age)
    {
        tdgaSetAge(age);
    }
	
	void c_tdgaSetAccountName( const char* name )
	{
        tdgaSetAccountName(name);
	}
	
	void c_tdgaSetLevel( int level )
	{
        tdgaSetLevel(level);
	}
	
	void c_tdgaSetGameServer( const char* gameServer )
	{
        tdgaSetGameServer(gameServer);
	}
	
	void c_tdgaOnPurchase( const char* item, int itemNumber, double priceInVirtualCurrency )
	{
        tdgaOnPurchase(item, itemNumber, priceInVirtualCurrency);
	}
	
	void c_tdgaOnUse( const char* item, int itemNumber )
	{
        tdgaOnUse(item, itemNumber);
	}
	
	void c_tdgaOnBegin( const char* missionId )
	{
        tdgaOnBegin(missionId);
	}
	
	void c_tdgaOnCompleted( const char* missionId )
	{
        tdgaOnCompleted(missionId);
	}
	
	void c_tdgaOnFailed( const char* missionId, const char* cause )
	{
        tdgaOnFailed(missionId, cause);
	}
	
	void c_tdgaOnEvent( const char* eventId, const char* jsonEventData )
	{
        tdgaOnEvent(eventId, jsonEventData);
	}
	
	void c_tdgaOnReward( double virtualCurrencyAmount, const char* reason )
	{
        tdgaOnReward(virtualCurrencyAmount, reason);
	}
	
	//st    
	
}