var fs=require('fs');
var path=require('path');
var exec = require('child_process').exec;
global.window=global;
require(__dirname+'/update.js');
require(__dirname+'/asset.js');

var updates=window.noname_update;
var newversion=false;
var commit=false
if(process.argv[2]){
	if(/[0-9]/.test(process.argv[2][0])){
		newversion=true;
		updates.update = updates.version;
		updates.version = '1.9.' + process.argv[2];
		commit=updates.version;
	}
	else{
		commit=process.argv[2];
	}
}
var assetlist='';
var skinlist='window.noname_skin_list={\n';
var entrylist=[];
var entrymap={};
var get = function(dir,callback){
	fs.readdir(dir,function(err,list){
		var shift=function(){
			if(list.length){
				var filename=list.shift();
				var delay=false;
				if(!/\.|~|_/.test(filename[0])){
					var url=dir+'/'+filename;
					var stat=fs.statSync(url);
					if(stat.isFile()){
						if(['.jpg','.png','.mp3','.ttf'].indexOf(path.extname(url))!=-1){
							var assetentry=path.relative(path.dirname(__dirname),url);
							assetlist+=',\n\t\''+assetentry+'\'';
							entrylist.push(assetentry);
						}
					}
					else if(stat.isDirectory()){
						if(dir==path.dirname(__dirname)+'/image/skin'){
							fs.readdir(url,function(err,list){
								var num=0;
								for(var i=0;i<list.length;i++){
									var url2=url+'/'+list[i];
									var stat=fs.statSync(url2);
									if(stat.isFile()&&path.extname(url2)=='.jpg'){
										num++;
									}
								}
								skinlist+='\t'+filename+':'+num+',\n';
								entrymap[filename]=num;
								shift();
							});
							delay=true;
						}
						else{
							get(url,shift);
							delay=true;
						}
					}
				}
				if(!delay){
					shift();
				}
			}
			else{
				callback();
			}
		}
		shift();
	});
};


get(path.dirname(__dirname),function(){
	var diff=false;
	if(window.noname_asset_list.length==entrylist.length+1){
		for(var i=0;i<entrylist.length;i++){
			if(entrylist[i]!=window.noname_asset_list[i+1]){
				diff=true;
				break;
			}
		}
		if(!diff){
			for(var i in entrymap){
				if(window.noname_skin_list[i]!==entrymap[i]){
					diff=true;
					break;
				}
			}
			for(var i in noname_skin_list){
				if(window.noname_skin_list[i]!==entrymap[i]){
					diff=true;
					break;
				}
			}
		}
	}
	else{
		diff=true;
	}
	var next=function(){
		exec('git diff --name-only', (error, stdout, stderr) => {
			var updatelist='window.noname_update={\n\tversion:\''+updates.version+'\',';
			updatelist+='\n\tupdate:\''+(updates.update||'')+'\',';
			var apply=function(name,list){
				updatelist+='\n\t'+name+':[\n';
				for(var i=0;i<list.length;i++){
					updatelist+='\t\t\''+list[i]+'\'';
					if(i<list.length-1){
						updatelist+=',';
					}
					updatelist+='\n';
				}
				updatelist+='\t]';
			};
			if(updates.changeLog){
				apply('changeLog',updates.changeLog);
				updatelist+=',';
			}
			if(updates.players){
				apply('players',updates.players);
				updatelist+=',';
			}
			if(updates.cards){
				apply('cards',updates.cards);
				updatelist+=',';
			}
			var changes = stdout.split('\n');
			for(var i=0;i<changes.length;i++){
				var extname=path.extname(changes[i]);
				if(!changes[i]||(extname!='.js'&&extname!='.css')||changes[i]=='game/update.js'){
					changes.splice(i--,1);
				}
			}
			var files;
			if(newversion){
				files = [];
			}
			else{
				files = updates.files || [];
			}
			for(var i=0;i<changes.length;i++){
				if(files.indexOf(changes[i])===-1){
					files.push(changes[i])
				}
			}
			files.sort(function(a,b){
				if (a>b) return 1;
				if (a<b) return -1;
				return 0;
			})
			apply('files',files);
			fs.writeFile('game/update.js',updatelist+'\n};','utf-8',function(){
				console.log('updated update.js');
				if(commit && typeof commit==='string'){
					exec('git add . && git commit -am '+commit);
					console.log('committed '+commit);
				}
			});
		});
	}
	if(diff){
		var assetversion='window.noname_asset_list=[\n\t\''+updates.version+'\'';
		fs.writeFile('game/asset.js',assetversion+assetlist+'\n];\n'+skinlist.slice(0,skinlist.length-2)+'\n};','utf-8',function(){
			console.log('udpated asset.js');
			next();
		});
	}
	else{
		next();
	}
});