//
//  BatteryCheck.m
//  ZeroRec/ChariReco
//
//  RecView用とRootView用の２つの処理を含んでいる
//
//  Created by AIG-Soft on 11/04/12.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "BatteryCheck.h"
#import	"Battery.h"
#import	"libs.h"
#import	"click.h"

@implementation BatteryCheck

//--------------------------------------
// バッテリーチェック for RecView
//--------------------------------------

-(void)reset
{
	fbatteryAlert=NO;
}

-(void)stop
{
	printSelf();
	if (_battery!=nil) {
		  // これで通知も停止される
		_battery=nil;
	}
}

-(void)display:(id)sender
// 現在の電池状態表示
// 充電器につながってないときのみ呼び出される
{
	batteryMeter.progress	= [UIDevice currentDevice].batteryLevel;
	batteryMeter.hidden		=
	labelPercent100.hidden	=
	labelPercent0.hidden	= NO;
	nslog(@"displayBattery:%f",batteryMeter.progress);
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
// アラートビューでボタンがクリックされた時に呼び出されるデリゲート
//　下のAlert1()だけでなく、iOSが出す電池警告もここで受ける
{
	printSelfs(@"btn=%d",(int)buttonIndex);
	if (fbatteryAlert==NO) {
		// 今回はOKのみなのでボタン判定なし
		nslog(@"電池切れ");
		clickSound();
	}
}

-(void)checkLevel:(NSNotification *)notification
// 電池残量の変化でここに来る
{
	printSelf();
	if (![_battery getBatteryStatusOK:BATTERY_LOW_LIMIT target:self selector:@selector(display:)]) {
		if (fbatteryAlert==NO) { // まだ警告を表示してないとき（条件が成立しているときは何度も発報するので多重排除が必須）
			fbatteryAlert=YES; // 警告表示中
			nslog(@"電池不足で動作継続不可");
			// 先に登録関数を呼び出す(呼び出し側)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"        // 警告回避のため
			[target_ performSelector:selector_ withObject:nil];
#pragma clang diagnostic pop
			// アラート表示
			Alert1(@"LOWBATT",@"LOWBATTMES",self);
		} // 通知設定の都合上、警告が複数回出る。それを排除している
	}
}

-(void)checkStat:(NSNotification *)notification
// 充電器接続状態の変化でここに来る
// 実際にはなんども呼び出されるので、変化時だけではない様子
{
	printSelf();
	if ([_battery getBatteryStatus]==UIDeviceBatteryStateUnplugged) {
		// 電池駆動中は初期表示
		nslog(@"電池駆動中は表示:level=%f",_battery.level);
		[self display:nil];
	} else {
		nslog(@"充電中は初期表示なし");
		batteryMeter.hidden		=
		labelPercent100.hidden	=
		labelPercent0.hidden	=YES; // 最初は残量表示しない
	}
}

-(void)start
// 電池チェック開始
{
	printSelf();
	_battery=[[Battery alloc]init];
	// 2つのNotificationを登録しているが、両方から呼び出しがかかっているような気がする
	[_battery setNortificationBatteryChange:self selectorLevel:@selector(checkLevel:) selectorStat:@selector(checkStat:)];
	nslog(@"checkBatteryStat強制呼び出し");
	[self checkStat:nil];
}

-(id)initWithLabels:(UIProgressView *)meter label0:(UILabel *)lbl0 label100:(UILabel *)lbl100 target:(id)target selector:(SEL)selector;
{
	self=[super init];
	if (self!=nil) {
		// 保存
		batteryMeter	= meter;
		labelPercent0	= lbl0;
		labelPercent100	= lbl100;
		target_			= target;
		selector_		= selector;
		[self reset];
	}
	return (self);
}

-(void)dealloc
{
	[self stop];
}

//--------------------------------------
// バッテリーチェック for RootView
//--------------------------------------
// ここに入れてるのはAlert表示を共用化するため(だけ)

-(BOOL)check
// 録画開始前電池残量チェック
// リターン値:YES=起動したらダメ , NO=OK
{
	BOOL ret=NO;
	[self reset];
	_battery=[[Battery alloc]init]; // バッテリー監視開始
	nslog(@"バッテリーチェック:%f",_battery.level);
	if (![_battery getBatteryStatusOK:BATTERY_LOW_LIMIT target:nil selector:@selector(batteryCheck)]) { // target=nilなので状態表示関数は呼び出さない
		nslog(@"バッテリーが足りない");
		NSString *mes=[[NSString alloc]
							initWithFormat:NSLocalizedString(@"NOBATTERY",@"電池残量が足りません"),
							(NSInteger)((_battery.level+0.005)*100.0)
					   ];
		// ↑%表示なので100倍している
		// ところが浮動小数点なので、累積演算誤差で正しい値が出ないので四捨五入相当が起こるように+0.005している(*100で+0.5)
		UIAlertView *aview=[[UIAlertView alloc]
								initWithTitle:NSLocalStr(@"CANTREC")
									  message:mes
									 delegate:self
							cancelButtonTitle:NSLocalStr(@"CLOSE")
							otherButtonTitles:nil,nil
							];
		setAlertViewResize(aview); // リサイズ設定
		[aview show]; // 表示したらすぐ帰ってくる
		ret=YES; // 起動できない印
	}
	// recView内の電池警告は別インスタンスなので関係ない
	return (ret);
}

@end
