//
//  setup.m
//  X-BASIC'
//
//  Created by AIG-Soft on 2012/8/13
//  Copyright 2012-2015 AIG-Soft. All rights reserved.
//

#import "main.h"
#import "Setup.h"
#import "click.h"
#import "libs.h"
#import "FileControl2.h"
#include "fdef.h"
#include "XBversions.h"

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

@implementation Setup

// setter

// .basicFile=した時に呼び出される
-(void)setBasicFile:(NSString *)basicFile_
{
	printSelf();
	_basicFile=basicFile_;
	nslog(@"basicFile=%@",basicFile_);
	if ([_basicFile isEqualToString:PATH_NEWFILE]) {
		_basicFileOnly=PATH_NEWFILE;
	} else {
		self.basicFileOnly=[_basicFile lastPathComponent]; // ファイル名のみを記録
	}
	nslog(@"basicFileOnly=%@",_basicFileOnly);
}

//-----------------------------------------
// v3.00でfsjisをBOOL記録からINTEGER記録に変更した

// setupの設定をXBのoperationStatusに渡す
-(void)setup2XBoperationStatus
{
	if (isLocalizeJapan()) {
		// 日本語のとき
		operationStatus.fenglish=NO;			// YES=英語モード , NO=日本語モード
	} else {
		operationStatus.fenglish=YES;			// YES=英語モード , NO=日本語モード
	}
	operationStatus.fundefVarInt=_fundefVarInt;	// YES=未宣言変数を自動的にintで定義する , NO=エラーにする
	operationStatus.fsjisInSetup=(int)_fsjis;	// FSJIS_*
	operationStatus.fsprite		=_fsprite;		// YES=スプライト関数有効
	operationStatus.fX68		=_fX68;			// YES=X68互換関数有効
	operationStatus.fOlder		=_fOlder;		// YES=表示V3.00未満有効
	operationStatus.ferrSource	=NO;			// YES=エラー時にソース行は表示しない（iOS版はエディターを持っているから）
	operationStatus.sz_str		=_sz_str;		// 1文字列長 ; EOSを含むバイト数。SZ_WORDの倍数であること
	switch (_ferrorCodeFopen) {
		case ErrorCodeFopenOLD: // 旧
			operationStatus.errorCodeFopen=0;
			break;
		case ErrorCodeFopenNEW: // 新
			operationStatus.errorCodeFopen=-1;
			break;
	}
	Var1Size[VAR_STR]=operationStatus.sz_str;
}

#ifdef DEBUG
-(void)displaySetup
{
	// setup追加時はここに追加
	NSLog(@"fundefVarInt=%d",_fundefVarInt);
	NSLog(@"fsjis=%d"		,(int)_fsjis);
	NSLog(@"fsprite=%d"		,_fsprite);
	NSLog(@"fX68=%d"		,_fX68);
	NSLog(@"fOlder=%d"		,_fOlder);
	NSLog(@"ferrorCodeFopen=%d",(int)_ferrorCodeFopen);
	NSLog(@"sz_str=%zd"		,_sz_str);
	NSLog(@"basicFile=%@"	,_basicFile);
	NSLog(@"fontName=%@"	,_fontName);
	NSLog(@"fontSize=%f"	,_fontSize);
}
#endif

// 設定値の保存(プログラム内からの変更点のみ)
// 常に最新の構造でOK
-(void)saveSetup
{
	printSelf();
	NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
	//
	// バージョン情報：これらは外部設定(Root.strings)でも参照している
	[defaults setObject:programVersion			forKey:keyProgramVersion];
	[defaults setObject:@VERSION_IOS_INTERFACE	forKey:keyiOSInterfaceVersion];
	[defaults setObject:@VERSION_CORE			forKey:keyCoreVersionVersion];
	[defaults setObject:@VERSION_XBFUNC			forKey:keyStandardFunctionVersion];
	[defaults setObject:@VERSION_XBFUNC2		forKey:keyExtendFunctionVersion];
	[defaults setObject:@VERSION_XBFILEFUNC		forKey:keyFileFunctionVersion];
	[defaults setObject:@VERSION_XBIOSFUNCT		forKey:keyiOSFunctionTVersion];
	[defaults setObject:@VERSION_XBIOSFUNCG		forKey:keyiOSFunctionGVersion];
	[defaults setObject:@VERSION_XBIOSFUNCK		forKey:keyiOSFunctionKVersion];
	[defaults setObject:@VERSION_XBIOSFUNCS		forKey:keyiOSFunctionSVersion];
	[defaults setObject:@VERSION_XBIOSFUNCM		forKey:keyiOSFunctionMVersion];
	[defaults setObject:@VERSION_XBIOSFUNCA		forKey:keyiOSFunctionAVersion];
	[defaults setObject:@VERSION_XBIOSFUNCSP	forKey:keyiOSFunctionSPVersion];
	[defaults setObject:@VERSION_XBIOSFUNCX68	forKey:keyiOSFunctionX68Version];
	[defaults setObject:@VERSION_XBIOSFUNCCARD	forKey:keyiOSFunctionCARDVersion];
	//
	[defaults setBool:_fundefVarInt			forKey:keyFundefVarInt];
	[defaults setInteger:_fsjis				forKey:keyFsjis];			// v3.00で変更
	[defaults setBool:_fsprite				forKey:keyFsprite];
	[defaults setBool:_fX68					forKey:keyFX68];
	[defaults setBool:_fOlder				forKey:keyFOlder];
	[defaults setInteger:_sz_str			forKey:keySz_str];
	[defaults setInteger:_ferrorCodeFopen	forKey:keyFErrorCodeFopen];
	[defaults setObject:_basicFile			forKey:keyBasicFile];
	[defaults setObject:_fontName			forKey:keyFontName];
	[defaults setFloat:_fontSize			forKey:keyFontSize];
	//
	[defaults synchronize]; // 同期(即時反映);iOS4では必須
#ifdef DEBUG
	[self displaySetup];
#endif
}

// 一番最初のSETUP値設定
// アプリケーションインストール後/バージョンアップ後1回だけ
// mode=SET_SETUP_*
-(void)initialSetup:(NSUInteger)mode
{
	nslog(@"Setup一番最初の初期化");
	// デフォルト設定値
	NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
	switch (mode) {
		case SET_SETUP_ALL:
			nslog(@"SET_SETUP_ALL");
			self.basicFile	=PATH_NEWFILE;	// 初期は新規作成
			_fundefVarInt	=NO;
			_fsjis			=FSJIS_AUTO;
			_sz_str			=256;	// EOSを含む
			if (isLocalizeJapan()) {
				// 日本語のとき
				self.fontName=@"IPAGothic";
			} else {
				// 英語の時
				self.fontName=@"IPAGothic";
			}
			_fontSize	= UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad? 16.0:13.0;
			// 保存(外部)
			_fsound			=YES;
			[defaults setBool:_fsound forKey:keyFsound];
		case SET_SETUP_V20:
			nslog(@"SET_SETUP_V20");
			_fsprite		=YES;	// 無償にしたのでデフォルトはON
		case SET_SETUP_V30:
			nslog(@"SET_SETUP_V30");
			_fX68			=YES;	// デフォルトはON
			_fOlder			=NO;	// デフォルトはOFF
		case SET_SETUP_V31:
			nslog(@"SET_SETUP_V31");
			_ferrorCodeFopen=ErrorCodeFopenNEW;	// デフォルトは新
			_fX68			=YES;	// デフォルトはON
			_fOlder			=NO;	// デフォルトはOFF
		case SET_SETUP_V32:
			nslog(@"SET_SETUP_V32");
			_fdisplayDebugButton=YES;
			[defaults setBool:_fdisplayDebugButton forKey:keyFdisplayDebugButton];
			break;
	}
	// 初期保存
	[defaults setBool:YES forKey:keyInitialSetup];		// 初期設定をした印(V1.0〜)
	[defaults setBool:YES forKey:keyInitialSetupV20];	// 初期設定をした印(V2.0〜)
	[defaults setBool:YES forKey:keyInitialSetupV30];	// 初期設定をした印(V3.0〜)
	[defaults setBool:YES forKey:keyInitialSetupV31];	// 初期設定をした印(V3.1)
	[defaults setBool:YES forKey:keyInitialSetupV32];	// 初期設定をした印(V3.2)
	// setup追加時はここに追加
	//
	// 保存(内部)
	[self saveSetup];
}

// SETUP読み込み
// リターン値：YES=初回起動
-(BOOL)loadSetup
{
	printSelf();
	
	NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
	// インストール直後かどうかを判定
	if ([defaults boolForKey:keyInitialSetup]==NO) { // 新規インストールの時(defaultなし)
		nslog(@"initialSetup:SET_SETUP_ALL");
		// でも、KeyChainによる共有設定はあるかもしれない
		[self initialSetup:SET_SETUP_ALL];
		//
		return (YES); // 初回起動の印
	}
	nslog(@"完全初回以外");
	//
	// 従来の設定値であるだけは読み込む
	// setup追加時はここにも追加:バージョン変更時に追加された値はここでは1回めは読めないがかまわない
	_fundefVarInt	=[defaults    boolForKey:keyFundefVarInt];
	_fsjis			=[defaults integerForKey:keyFsjis];		// v3.00で変更
	_fsprite		=[defaults    boolForKey:keyFsprite];	// v2.0
	_fX68			=[defaults    boolForKey:keyFX68];		// v3.00
	_fOlder			=[defaults    boolForKey:keyFOlder];	// v3.00
	_sz_str			=[defaults integerForKey:keySz_str];
	_ferrorCodeFopen=[defaults integerForKey:keyFErrorCodeFopen];	// v3.10
	self.basicFile	=[defaults  objectForKey:keyBasicFile];
	self.fontName	=[defaults  objectForKey:keyFontName];
	_fontSize		=[defaults   floatForKey:keyFontSize];
	// 以下はUserDefaultには保存しない
	_fselectSources	= SOURCE_SELECT_BOTH;
#ifdef DEBUG
	[self displaySetup];
#endif
	// Version系は「設定」での表示専用なので、プログラム中に取り込む必要なし
	//
	// 新規設定値はデフォルトを設定する
	if ([defaults boolForKey:keyInitialSetupV32]==NO) { // v3.2では初回
		nslog(@"v3.2では初回");
		[self initialSetup:SET_SETUP_V32]; // デフォルト設定＆記録
	}
	if ([defaults boolForKey:keyInitialSetupV31]==NO) { // v3.1では初回
		nslog(@"v3.1では初回");
		[self initialSetup:SET_SETUP_V31]; // デフォルト設定＆記録
	}
	if ([defaults boolForKey:keyInitialSetupV30]==NO) { // v3.0では初回
		nslog(@"v3.0では初回");
		[self initialSetup:SET_SETUP_V30]; // デフォルト設定＆記録
	}
	if ([defaults boolForKey:keyInitialSetupV20]==NO) { // v2.0では初回
		nslog(@"v2.0では初回");
		[self initialSetup:SET_SETUP_V20]; // デフォルト設定＆記録
	}
	// setup追加時はここに追加

	return (NO); // 初回起動ではない
}

// 「設定画面」分読み込み
-(void)readSetupOuter
{
	printSelf();
	NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];

	_fsound=[defaults boolForKey:keyFsound];
	nslog(@"fsound=%d",_fsound);
	
	_fdisplayDebugButton=[defaults boolForKey:keyFdisplayDebugButton];
	nslog(@"fdisplayDebugButton=%d",_fdisplayDebugButton);
	//
	clickOnOff(_fsound);
}

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

@end
