//
//  Battery.m
//  電池状態取得のためのクラス
//
//  Created by AIG-Soft on 11/03/24.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "Battery.h"
#import "libs.h"

@implementation Battery

// 電池残量チェックモニタリングのon/off
// これまたはsetNortificationBatteryChangesしないと、電池状態は読み出せない
-(void)setGetBatteryStatus:(BOOL)onoff
{
	printSelfs(@"%d",onoff);
	[UIDevice currentDevice].batteryMonitoringEnabled=onoff; // モニタリング機能の設定
	fGetBatteryStatus=onoff;
}

// 現在の状態取得
-(UIDeviceBatteryState)getBatteryStatus
{
//	printSelf();
	if (isJIKKI()) {
		// 実機
		_level=[UIDevice currentDevice].batteryLevel;
		_stat =[UIDevice currentDevice].batteryState;
		if (_stat==UIDeviceBatteryStateUnknown) {
			// 電池状態が取得できてないときは電池残り無しとする
			_level=0.0;
		}
		//nslog(@"実機:%d=%f",stat,level);
	} else {
		// シミュレーター上
		nslog(@"シミュレーター上");
		_stat =UIDeviceBatteryStateFull; // フル充電状態
		_level=1.0; // 満充電
	}
	return(_stat);
}

// 充電中かどうか(YES=充電中)
-(BOOL)isPlugged
{
	switch ([self getBatteryStatus]) {
		case UIDeviceBatteryStateFull:
			// 充電器が繋がっており、フル充電状態
//			nslog(@"充電器が繋がっており、フル充電状態");
			return (YES); // 問題ない（状態表示はしない）
		default: // 警告回避のため
		case UIDeviceBatteryStateCharging:
			// 充電器が繋がっており、充電中状態；残りが少ない時の動作が気になるが、とりあえずOKとしておく
//			nslog(@"充電器が繋がっており、充電中状態");
			return (YES); // 問題ない（状態表示はしない）
	}
	return(NO);
}

// 動作して問題ない電池状態かどうか調べる
// limit : これ以下になっていたらNOにする
// target+selector : 充電器につながってないときに呼び出すメソッド(target=nilの時は呼び出さない）
// リターン値：YES=問題なし , NO=やばい
-(BOOL)getBatteryStatusOK:(float)limit target:(id)target selector:(SEL)selector
{
	printSelf();
	switch ([self getBatteryStatus]) { // stat/levelの確定
		case UIDeviceBatteryStateUnknown:
			// 状態不明
			// ![UIDevice currentDevice].batteryMonitoringEnabledのときはここに来る
			// 取得してもダメなときは使えないと判定しておく（でも状態表示はできない）
			return (NO);
			
		default: // 警告回避のため
		case UIDeviceBatteryStateFull:
			// 充電器が繋がっており、フル充電状態
			nslog(@"充電器が繋がっており、フル充電状態");
			return (YES); // 問題ない（状態表示はしない）
			
		case UIDeviceBatteryStateCharging:
			// 充電器が繋がっており、充電中状態；残りが少ない時の動作が気になるが、とりあえずOKとしておく
			nslog(@"充電器が繋がっており、充電中状態");
			return (YES); // 問題ない（状態表示はしない）
	}
	// UIDeviceBatteryStateUnplugged
	// 充電器にはつながってない
	nslog(@"充電器にはつながってない");
	[target performSelector:selector withObject:@(_level) afterDelay:0.0]; // 状態表示する
	// levelがlimitより多ければYES（電池OK）
	return (_level>limit);
}

// 電池状況変化に対する通知の設定
// 通知先は外部から指定する
// 初期化は先に行っておくこと
-(void)setNortificationBatteryChange:(id)target selectorLevel:(SEL)selectorLevel selectorStat:(SEL)selectorStat
{
	printSelf();
	// 通知設定
	[[NSNotificationCenter defaultCenter] addObserver:target
											 selector:selectorLevel
												 name:UIDeviceBatteryLevelDidChangeNotification
											   object:nil];
	[[NSNotificationCenter defaultCenter] addObserver:target
											 selector:selectorStat
												 name:UIDeviceBatteryStateDidChangeNotification
											   object:nil];
}

// 電池状況変化に対する通知の解除
-(void)resetNortificationBatteryChange
{
	printSelf();
	// 機能無効化
	[self setGetBatteryStatus:NO];
	// 通知解除
	[[NSNotificationCenter defaultCenter]removeObserver:self
												   name:UIDeviceBatteryLevelDidChangeNotification
												 object:nil];
	[[NSNotificationCenter defaultCenter]removeObserver:self
												   name:UIDeviceBatteryStateDidChangeNotification
												 object:nil];
}

// 初期化：モニタリングONする
-(id)init
{
	self=[super init];
	if (self) {
		[self setGetBatteryStatus:YES]; // バッテリーチェックをONにする
		[self getBatteryStatus]; // 初期状態取得
	}
	return self;
}

-(void)dealloc
{
	[self resetNortificationBatteryChange]; // 通知解除
}

@end
