#!/usr/bin/perl 
use strict;
use warnings;
use DBI;#使用資料庫

#連接資料庫相關參數
my $db = "EMS"; #database 名稱
my $host = "localhost"; #host name
my $user = "EMS"; #資料庫帳號
my $password = "*******"; #資料庫密碼

#模擬設定相關參數
my $id;#使用者帳號
my $date;#送出模擬日期
my $status;#模擬狀態
my $stime;#開始模擬時間
my $etime;#結束模擬時間
my $frequency;#模擬次數
my $simtime;#模擬時間
my $method;#選擇的行車策略
my $ptime;#預估剩餘時間
my $progress;#預估進度

my $tfileNum;#模擬總共會產生的log檔案數
my @docStat;#檔案資訊參數
my $editTime;#檔案修改時間
my $fileNum;#資料夾內的檔案個數
my $tTime;#目前總共模擬時間
my $avgTime;#計算平均一次模擬所需要的時間

#連結資料庫並且取得模擬參數
sub predict{
	#初始化參數
	$id = ();
	$date = ();
	$status = ();
	$stime = ();
	$etime = ();
	$frequency = ();
	$simtime = ();
	$method = ();
	$ptime = ();
	$progress = ();

	#連接Database 
	my $dbh = DBI->connect ("DBI:mysql:database=$db:host=$host", $user, $password) 
		or die "Can't connect to database: $DBI::errstr\n";
	
	#準備執行SQL指令
	#選取status為1的row data
	my $sth = $dbh->prepare("SELECT * FROM `Simulation` WHERE `status` = 1");
	#執行SQL指令
	$sth->execute();

	#將資料暫存於row
	while (my @row = $sth->fetchrow_array()){
		print "@row\n";
		#存入變數
		print "Save Arg...\n";
		$id = $row[0];
		$row[1]=~ s/\s/-/;#把空白用-取代
		$row[1]=~ s/:/-/g;#把空白用-取代
		$date = $row[1];
		$status = $row[2];
		$stime = $row[3];
		#$etime = $row[4];
		$frequency = $row[9];
		#$simtime = $row[10];
		$method = $row[14];
		#$ptime = $row[15];
		#$progress = $row[16];

		#計算模擬總共會產生的log檔案數量加上圖檔及報表
		$tfileNum = $frequency * length($method)+5;
		print "Total log num:$tfileNum\n";

		#取得目前資料夾檔案數目
		$fileNum = `ls /var/www/EMS_script/usr/$id/$date/output/Data |wc -l`;
		print "fileNum:$fileNum\n";
		
		#當完成第一次模擬結果輸出時，開始估計進度&剩餘時間
		if ($fileNum > 2 && $fileNum <= $tfileNum) {
			#顯示開始模擬時間並轉換為epoch time
			$stime = `date -d "$stime" +%s`;
			print "Start time:$stime\n";

			#取得檔案最後修改時間
			@docStat = stat("/var/www/EMS_script/usr/$id/$date/");
			#輸出epoch time
			$editTime = $docStat[9];
			print "Edit time:$editTime\n";

			#轉換為local time
			#print scalar(localtime($docStat[9])) . "\n";
			
			#計算目前Total模擬時間
			$tTime = ($editTime-$stime);
			print "Total time:$tTime\n";

			#計算平均一次模擬所需要的時間
			$avgTime = $tTime / $fileNum;
			print "Average time:$avgTime\n";

			#預估剩餘模擬時間
			$ptime = time+($avgTime*$tfileNum)-$tTime;
			print "ptime: $ptime\n";
			#計算目前進度
			$progress = int(($tTime / ($avgTime*$tfileNum))*100);
			print "Progress: $progress%\n";

			#更新database
			my $cmd = $dbh->prepare("UPDATE `Simulation` SET `ptime` = FROM_UNIXTIME($ptime), `progress` = '$progress%' WHERE `ID` = '$id'  AND `date` = '$date'");
			#執行SQL指令
			$cmd->execute();
			#結束command
			$cmd->finish();
			#中斷資料庫連結
			#$dbh->disconnect or warn "Disconnection error: $DBI::errstr\n";
		}
	}
}

while (1){
	&predict;
	sleep(5);
}
