"use strict";
var fs = require( 'fs' );
var path = require( 'path' );
var exec = require( 'child_process' ).exec;
var color = require( './util/color' );

var obj = {};

obj.log = function( msg ) {
	console.log( msg );
};
obj.error = function( msg ) {
	console.error( color.red( msg ) );
};

//创建文件夹（使用时第二个参数可以忽略）
obj.mkdir = function( dirpath, dirname ) {
	//判断是否是第一次调用
	if ( typeof dirname === "undefined" ) {
		if ( fs.existsSync( dirpath ) ) {
			return;
		} else {
			obj.mkdir( dirpath, path.dirname( dirpath ) );
		}
	} else {
		//判断第二个参数是否正常，避免调用时传入错误参数
		if ( dirname !== path.dirname( dirpath ) ) {
			obj.mkdir( dirpath );
			return;
		}
		if ( fs.existsSync( dirname ) ) {
			fs.mkdirSync( dirpath );
		} else {
			obj.mkdir( dirname, path.dirname( dirname ) );
			fs.mkdirSync( dirpath );
		}
	}
};
obj.copyFile = function( file, outFile, cb ) {
	//obj.log( '--------开始读取文件--------' );
	fs.readFile( file, 'utf-8', function( err, data ) {
		if ( err ) {
			obj.error( "读取失败： " + err );
		} else {
			if ( cb ) {
				data = cb( data );
			}
			obj.writeFile( outFile, data );
			return data;
		}
	} );
	//obj.log( '--------读取结束--------' );
};
obj.writeFile = function( file, data ) {
	var files = file.split( "/" );
	fs.writeFile( file, data, 'utf8', function( error ) {
		if ( error ) {
			//throw error;
			obj.error( "写入失败： " + error );
		} else {
			obj.log( "写入完成： " + files[ files.length - 1 ] );
		}
	} );
};
/*
 * 复制目录中的所有文件包括子目录
 * @param{ String } 需要复制的目录
 * @param{ String } 复制到指定的目录
 */
obj.copyDir = function( src, dst, callback ) {
	var dirCopy = function( src, dst ) {
		// 读取目录中的所有文件/目录
		fs.readdir( src, function( err, paths ) {
			if ( err ) {
				obj.error( "读取失败： " + err );
			} else {
				paths.forEach( function( path ) {
					var _src = src + '/' + path,
						_dst = dst + '/' + path;

					fs.stat( _src, function( err, st ) {
						if ( err ) {
							obj.error( "读取失败： " + err );
						} else {
							// 判断是否为文件
							if ( st.isFile() ) {
								obj.copyFile( _src, _dst, callback );
							}
							// 如果是目录则递归调用自身
							else if ( st.isDirectory() ) {
								fileExists( _src, _dst, dirCopy );
							}
						}
					} );
				} );
			}
		} );
	};
	// 在复制目录前需要判断该目录是否存在，不存在需要先创建目录
	var fileExists = function( src, dst, cb ) {
		fs.access( dst, function( err ) {
			// 不存在
			if ( err ) {
				fs.mkdir( dst, function() {
					cb( src, dst );
				} );
			}
			// 已存在
			else {
				cb( src, dst );
			}
		} );
	};

	fileExists( src, dst, dirCopy );
};

obj.exec = function( cmd, conf, callback ) {
	if ( !cmd ) {
		return obj.error( "请输入你要执行的命令！！" );
	}
	var ex = exec( cmd, conf || {} );

	ex.stdout.on( 'data', function( data ) {
		obj.log( data );
	} );

	ex.stderr.on( 'data', function( data ) {
		obj.error( data );
	} );

	ex.on( 'exit', function( code ) {
		if ( callback ) {
			callback( code );
		} else {
			obj.log( "执行完成。" );
		}
	} );
};

exports.obj = obj;