//
//  Log.m
//  ZeroRec
//
//  Created by AIG-Soft on 11/03/14.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "Log.h"
#import	"FileControl2.h"

Log logs; // ログ

void saveLog(NSString *logname)
// ログを書き出す
{
	printFuncs(@"%d件",(int)logs.count);
	// Cの構造体をNSDataに直して保存する
	NSData *data=[NSData dataWithBytes:&logs length:SZ_LOG];
	if ([data writeToFile:makeFullPathForSaveData(logname) atomically:YES]==NO) {
		// !! error !!
		// 本来エラーを取るべきだが、今回はログは録画動作に対して致命的ではないので、無視する
		// ファイルの大きさは変化しないから、1回作成できたら後は大丈夫なはずで、
		// それでもエラーが出るときはiOS上で致命的な問題が起こっている可能せが高いので、ここで対処すべきではない
	}
	nslog(@"終了");
}

void readLog(NSString *logname,NSUInteger max_)
// ログを読み込む(初期化も含む)
{
	NSString *path=makeFullPathForSaveData(logname);
	NSFileManager *fileManager=[NSFileManager defaultManager];
	if ([fileManager fileExistsAtPath:path]) {
		// ファイルが存在するときはそれを読み込む
		nslog(@"readLog(ファイル):%@",path);
		NSData *data=[NSData dataWithContentsOfFile:path];
		// Cの構造体に治す
		[data getBytes:&logs length:SZ_LOG];
		// 不要
		// [data release];
		nslog(@"max=%d,count=%d,rp=%d,wp=%d",(int)logs.max,(int)logs.count,(int)logs.rp,(int)logs.wp);
	} else {
		nslog(@"readLog:新規作成");
		logs.max=max_;
		logs.rp=logs.wp=0;
		setLog(LOG_NAME_INIT); // 新規ログのログ
	}
}

void setLog(char *name_)
// ログ記録
// nameはLocalizeStringsの識別子で渡すこと
{
	printFuncs(@"%s",name_);
	LogData *log1=&logs.logdata[logs.wp]; // 今回の記録位置
	
	// 日時
	NSDateFormatter *formatter=[[NSDateFormatter alloc]init]; // initはiOS4.0で廃止されている
	[formatter setLocale:[NSLocale currentLocale]]; // Localeの設定(重要)
	[formatter setDateFormat:@"yyMMddHHmmss"];
	NSDate *date=[NSDate date];	// 一旦インスタンスに入れないとメモリリークを起こす
	NSString *dtstr=[formatter stringFromDate:date]; // 一旦インスタンスに入れないとメモリリークを起こす
	NSString *dt=[[NSString alloc]initWithString:dtstr];
	nslog(@"date=%@",dt);
	for (int i=0;i<SZ_LOGTIME;i++) {
		NSRange range;
		range=NSMakeRange(i*2,2);
		NSString *sub=[dt substringWithRange:range];
		log1->utime.btime[i]=[sub intValue];
	}
	nslog(@"20%02d/%02d/%02d %02d:%02d:%02d"
			,log1->utime.time.year
			,log1->utime.time.month
			,log1->utime.time.day
			,log1->utime.time.hour
			,log1->utime.time.minute
			,log1->utime.time.second
	);
	// ログ識別子名
	strcpy(log1->name,name_);
	
	if (logs.count<logs.max) logs.count++;
	if (++logs.wp>=logs.max) {
		logs.wp=0;
	}
	if (logs.wp==logs.rp) { // 上書き発生時
		if (++logs.rp>=logs.max) {
			logs.rp=0;
		}
	}
}

// すべてのログを文字列化して出力する
NSString *strLogAll(void)
{
	printFuncs(@"cnt=%d",(int)logs.count);
	NSMutableString *area=[[NSMutableString alloc]init];
	if (logs.count==0) {
		// ログが1つもないとき
		[area appendString:NSLocalizedString(@"NONE",@"なし")];
	} else {
		int i=(int)logs.rp;
		while (i!=logs.wp) {
			LogData *log1=&logs.logdata[i]; // 今回の読み出し位置
			char str[2+2+1+2+1+2+1+2+1+2+1+2+1];
			sprintf(str,"20%02d/%02d/%02d %02d:%02d:%02d"
					,log1->utime.time.year
					,log1->utime.time.month
					,log1->utime.time.day
					,log1->utime.time.hour
					,log1->utime.time.minute
					,log1->utime.time.second
					);
			NSString *dateStr=[[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];
			NSString *nameStr=[[NSString alloc]initWithCString:log1->name encoding:NSUTF8StringEncoding];
			[area appendFormat:@"%@ %@\n",dateStr,NSLocalStr(nameStr)];
			if (++i>=logs.max) {
				i=0;
			}
		}
	}
	return area;
}

