//
//  exitdelay.m
//  ZeroRec
//
//  Created by AIG-Soft on 11/04/09.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "exitdelay.h"
#import	"libs.h"
#import	"click.h"
#import	"Setup.h"
#import	"Battery.h"
#import "AppDelegate.h"

@interface ExitDelay()
{
	AppDelegate *app;
	Setup *setup;
}
@end

@implementation ExitDelay

#define END_EXITDELAY	(-2.0)	 // <=-1.0;0.0から-1.0されたのより小さい値

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
// アクションシートのボタンが押された
{
	// 残り時間表示タイマーを止める
	[exitdelayTimer invalidate];
	exitdelayTimer=nil;
	// 押されたボタンの保存
	abutton=asheet.firstOtherButtonIndex;
	if (buttonIndex==actionSheet.cancelButtonIndex) {
		nslog(@"ExitDelay:録画キャンセル");
		abutton=asheet.cancelButtonIndex;
	}
#ifdef DEBUG
	else {
		// 即時録画ボタン
		nslog(@"ExitDelay:録画開始");
	}
#endif
	// exitdelay終了の印
	delayTime=END_EXITDELAY;
}

-(void)actionSheetSetTitleLeftTime
// アクションシートの.titleを設定する（残り時間が入る）
{
	asheet.title=[NSString stringWithFormat:NSLocalizedString(@"EXITDELAYLEFT",@"%@\n残り %3d秒"),
				  NSLocalStr(@"EXITDELAY"),
				  (NSUInteger)(delayTime+0.5) // 四捨五入して表示(そうしないと残り0秒表示が出てしまう)
				  ]; // copy属性
}

-(void)leftTime:(id)sender
// ExitDelay残り時間の表示
{
	if (delayTime<1.0) {
		// 終了
		// ↓これは表示を消すだけで、clickedButtonAtIndexは呼び出さない
		[asheet dismissWithClickedButtonIndex:asheet.firstOtherButtonIndex animated:YES];
		[self actionSheet:asheet clickedButtonAtIndex:asheet.firstOtherButtonIndex];
	} else {
		delayTime-=(1.0); // 1秒減らす
		[self actionSheetSetTitleLeftTime];
		// カウントダウン音
		clickSound();
	}
}

-(void)exitDelay
// ExitDelayを表示する
{
	printSelf();
	delayTime=[setup getTmValues:TMExitDelay];
	// UIActionSheetは毎回alloc&initしないと二回目以降化けてしまう
	asheet = [[UIActionSheet alloc]
			   initWithTitle:nil
					delegate:self
		   cancelButtonTitle:NSLocalizedString(@"TORECCANCEL",@"録画キャンセル")	// ボタン番号=cancelButtonIndex
	  destructiveButtonTitle:nil
		   otherButtonTitles:NSLocalizedString(@"TORECSTART",@"即時録画開始"),	// ボタン番号=firstOtherButtonIndex 
	 nil
	 ];
	setActionSheetResize(asheet); // リサイズ指定
	// 初期タイトルの設定
	[self actionSheetSetTitleLeftTime];
	// 表示
	[asheet showInView:view];
	// タイマーで残り時間を表示する
	exitdelayTimer=[NSTimer timerWithTimeInterval:1.0 // 1秒単位
										   target:self
										 selector:@selector(leftTime:)
										 userInfo:nil
										  repeats:YES // 残り時間表示タイマーはリピート
					];
	AddTimerToRunLoop(exitdelayTimer); // 実行ループにタイマーを追加する
}

-(id)initWithView:(UIView *)view_
{
	
	self=[super init];
	if (self!=nil) {
		// 保存
		app=getAppDelegate();
		setup	=app.setup;
		view	=view_;
		asheet	=nil;
	}
	return(self);
}

-(BOOL)check:(Battery *)battery
// ExitDelayチェック
// リターン値 : YES=キャンセル , NO=録画へ
{
	BOOL ret=NO;
	if ([setup getTmValues:TMExitDelay]!=None && ![setup isSetting1Shot]) {
		// ExitDelay設定があり、１ショット録画でないとき
		// 初期表示
		[self exitDelay];
		// ここでその終了を待つ
		nslog(@"ExitDelay待ち中");
#ifdef USE_BATTERY
		BOOL fbat=[battery isPlugged];
#else
		BOOL fbat=NO; // バッテリーチェックさせない
#endif
		do {
			// runUntilDate=指定時間までの間RunLoopに戻る
			EnterRunLoop(0.5); // これがキーチェック間隔となる
			if (fbat==YES) {
				// もとが充電中だったが、このループ中にそうでなくなったときは、ExitDelayを中断して即時録画に入る
				if (![battery isPlugged]) {
					nslog(@"充電ケーブルが外されたのでExitDelay中断");
					break;
				}
			}
		} while (delayTime>END_EXITDELAY);
		//
		nslog(@"ExitDelay終了");
		ret=(abutton==asheet.cancelButtonIndex);
		[self quit]; // asheetが解放される
	}
	return (ret);
}

-(void)quit
// ExitDelayを強制的に抜けるときの処理
{
	if (asheet!=nil) {
		if (delayTime>=1.0) { // まだ表示中のはず
			[asheet dismissWithClickedButtonIndex:asheet.firstOtherButtonIndex animated:NO]; // 即時表示を消す
		}
		asheet=nil;
	}
	if (exitdelayTimer!=nil) {
		[exitdelayTimer invalidate];
		exitdelayTimer=nil;
	}
}

-(void)dealloc
{
	printSelf();
	[self quit];
}

@end
