//
//  AppDelegate.m
//  ZeroRec/Komadori
//
//  Created by AIG-Soft on 11/02/24.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "AppDelegate.h"
#import "main.h"
#import	"libs.h"
#import "click.h"
#import "PlaySound.h"
#import "Log.h"				// これはUSE_LOGにかかわらず読み込むこと

// グローバル(的)変数
static BOOL fnonActive=NO; // nonActiveになったかどうか

// iOS6のiPhoneで倒立のPortraitがうまく回転しないのを回避するための処理
@implementation NavigationControllerForiOS6

- (NSUInteger)supportedInterfaceOrientations
{
	return supportedInterfaceOrientationsByMain();
}

- (BOOL)shouldAutorotate
{
	return shouldAutorotateByMain();
}
@end



/// @brief AppDelegateを得る関数
AppDelegate *getAppDelegate(void)
{
	return (AppDelegate *) [[UIApplication sharedApplication] delegate];
}

@implementation AppDelegate


// バックグラウンドに入るときに開放して良いリソースの開放
-(void)releaseResouces
{
	printSelf();
	deallocClick(); // click音の開放
}

// リソースを読み直す
// バッググラウンドからの復帰時にも読みなおす
// ここに来たときにはmainViewとその中に含まれるrootViewは読み込み済みである
-(void)reloadResouces
{
	printSelf();

	// click音の取得
	initClick();
	// 起動音の取得
	launchSound=[[PlaySound alloc]initWithSound:CFSTR(SOUND_LAUNCH) ext:CFSTR("wav")];

	// ログ読み込みまたは初期化
	readLog(LOG_FILE,LOG_MAX);	// ログの読み込み

	// setupの読み出し；表示への反映は後で(ここで行っても反映されない)
	// 以下の初期化処理の中で参照されるのでここで先に読み込む
	_setup=[[Setup alloc]init];
	[_setup loadSetup];			// プログラム内部
	[_setup readSetupOuter];	//「設定」画面SETUP読み込み
#ifdef USE_ALARM
	// RotationControl実体の確保
	_setup.rotationControl=[[RotationControl alloc]init];
#endif
	
	// nibの読み込み
	_rootViewController=[[RootViewController alloc]init];
	// nib読み取り終了はviewDidLoadで判定（かなり先になることもある）
	[_recViewController initRecView];
	navigationController=[[NavigationControllerForiOS6 alloc]initWithRootViewController:_rootViewController]; // NavigationBarへルートとしての設定
	
	// Rec画面準備(縦横関係なし）
	_recViewController=[[RecViewController alloc]init];

	// 他は利用時に読み込む
}

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
	// この位置でカメラチェックのアラートを出すと
	// wait_fences: failed to receive reply:という警告が出る(起動には影響ないようだけど)
	
    // アプリケーション設定
	application.applicationSupportsShakeToEdit=NO; // シェイク編集不可
	//
	nslog(@"bundle path=%@",[[NSBundle mainBundle]bundlePath]);
	
	self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
	
	// リソースの読み込み
	[self reloadResouces];
	
	// 主画面表示
	nslog(@"主画面表示");
	[self.window setRootViewController:navigationController];
    [self.window makeKeyAndVisible];
	

#ifndef DEBUG
    // この機体がカメラが使えるかどうかを判定
	if (isJIKKI()) {
		// 実機のみ
		if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
			nslog(@"この機種では使えません");
			Alert1(@"CANTEXECUTE",@"NOCAMERA",self);
			// 表示だけ
			// 本当は起動させないようにしたかったが、うまい方法が見つからないので警告を表示するだけ
		}
	}
#endif

	// ファイルエラーに対する通知登録(これは一旦登録したら解除しない)
	[[NSNotificationCenter defaultCenter] addObserver:_rootViewController
											 selector:@selector(fileError:) // すべての引数がいることに注意!!
												 name:NOTIFICATION_FILE_ERR
											   object:nil];

	if (_setup.flaunchSound) {
		// 起動音
		[launchSound play];
	}

    return YES; // 画面が表示されるのはこの後
}

//-------------------------------------------

// アラートビューでボタンがクリックされた時に呼び出されるデリゲート
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
	printSelfs(@"button=%d",(int)buttonIndex);
	// 今回はOKのみなのでボタン判定なし
}

//-------------------------------------------

// アプリ終了処理
-(void)applicationEnd
{
	printSelf();
	// 各種停止処理
	[_recViewController recEnd];
#ifdef USE_BLUETOOTH
	[_rootViewController endOfBluetooth];
#endif
	// ログ書き出し
	saveLog(LOG_FILE);
}

// アプリケーションが本当に終了するとき
// iOS4では通常はHOMEボタンを押してもここには来ない
// UIApplicationExitsOnSuspend=YESの時に来る(サスペンド不可設定時)
- (void)applicationWillTerminate:(UIApplication *)application
{
	nslog(@"プログラム終了");
	[self applicationEnd];
	// 多分この後メモリ解放がある
}

// アプリケーションが非動作になるとき
// iOS4ではHOMEボタンを押すとここに来る
// UIApplicationExitsOnSuspend=NOの時に来る(サスペンド可設定時)
- (void)applicationWillResignActive:(UIApplication *)application
{
	nslog(@"プログラム非動作");
	fnonActive=YES; // nonActiveになる
	[self applicationEnd];
	// リソースを解放する;再アクティブ時に異常動作を起こすので中止
//	[self releaseResouces];
	//
	nslog(@"プログラム非動作化終了");
}

// アプリケーションが再起動するとき
- (void)applicationDidBecomeActive:(UIApplication *)application
{
	nslog(@"プログラム再アクティブ");

	if (!fnonActive) {
		// 起動時に、applicationWillResignActiveが呼ばれてないのに此処に来ることがあるので回避
		nslog(@"→回避");
		return;
	}
	// リソースを再設定する
	// setupも読み込まれる
//	[self reloadResouces]; // 再アクティブ時に異常動作を起こすので中止
	// マルチタスクで外部で設定が変更されているかもしれないので、読み込んでおく
	EnterRunLoop(0.0); // これがないと、「何故か」直前の「設定」での変更が反映されない
	[_setup readSetupOuter]; // 外部SETUP読み込み
#if 0

	if (!fresume) {
		// resumeしないときは全クリアする
		nslog(@"Not Resume");
	}
#ifdef DEBUG
	else {
		nslog(@"Resume");
	}
#endif
#endif
}

//-------------------------------------------------------------------

// iOS6
// 画面回転を許可するために呼び出される・・・ようである
// 個別のUIViewControllerがsupportedInterfaceOrientationsを持ってないときはこれを呼び出すらしい
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window_
{
	//	nslog(@"application.supportedInterfaceOrientationsForWindow:window=%@",window_);
	return supportedInterfaceOrientationsByMain();
}

//-------------------------------------------------------------------

- (void)applicationDidEnterBackground:(UIApplication *)application
{
	printSelf();
}


- (void)applicationWillEnterForeground:(UIApplication *)application
{
	printSelf();
}


#pragma mark -
#pragma mark Memory management

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
	printSelf();
	fmemwarn=YES;
}


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


@end

