//vc14 运行时（VC2015~2019）
import inet.installer;
import win.reg;

namespace sys.vc14;

isInstalled = function(minorVersion,buildNumber,architecture){
    architecture = architecture === "x64" ? architecture:"x86";
    
	if(type.isString(minorVersion) ){
		minorVersion = null;
		
		//VC2015版本:14.0.23026  VC2017版本:14.13.26020
		if(minorVersion=="2017"){
			minorVersion = 13;
			if( !buildNumber || (buildNumber<26020) ) buildNumber = 26020;	
		}
		elseif(minorVersion=="2019"){ 
			if( !buildNumber || (buildNumber<27820) ) buildNumber = 27820;
		}
	}
	
	var module = ::Kernel32.LoadLibraryExP("VCRUNTIME140.dll",,2/*_LOAD_LIBRARY_AS_DATAFILE*/ );
	if(!module) return;
	::Kernel32.FreeLibrary(module);
	
	//也就是 vcruntime140.dll 的版本号
	var reg = ..win.regReader("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\"+architecture);
	if(!reg) return;

	var installed = reg.queryValue("Installed");

	if(installed){
		if(minorVersion){
			installed = reg.queryValue("Minor")>minorVersion;	
		}
		
		if(buildNumber){
			installed = reg.queryValue("Bld")>buildNumber;	
		}
	}
	
	reg.close();
	
	return installed;
}

isInstalled64 = function(minorVersion,buildNumber,architecture){
    return isInstalled(minorVersion,buildNumber,"x64"); 
}

require = function(minorVersion,buildNumber,architecture){
    architecture = architecture === "x64" ? architecture:"x86";
    
    if(isInstalled(minorVersion,buildNumber,architecture)){
    	return true;
    }

	return !!..inet.installer("VC++ 2015~1019 支持组件"
		,"https://aka.ms/vs/16/release/vc_redist."+architecture+".exe"
		,`/install /quiet /norestart /log "%temp%\Install_vc_redist_2019_x86.log"`
	)	
}

require64 = function(minorVersion,buildNumber,architecture){
    return require(minorVersion,buildNumber,"x64"); 
}

/**intellisense(sys.vc14)
isInstalled( = 是否安装 VC++14 运行时\n注意 VC2015、2017、2019 都是使用同一运行库\n检测 VS 开发环境安装信息请使用库 process.vswhere
isInstalled(.(minorVersion,buildNumber)  =  可选在参数中指定最低 minorVersion 或 buildNumber,\n也可以直接在 minorVersion 中用字符串指定"2019","2017","2015"
isInstalled(.() = 是否安装 VC2015 运行时
isInstalled(.("2017") = 是否安装 VC2015 运行时
isInstalled(.("2019") = 是否安装 VC2015 运行时
isInstalled64(.() = 是否安装 VC2015 64位运行时
isInstalled64(.("2017") = 是否安装 VC2015 64位运行时
isInstalled64(.("2019") = 是否安装 VC2015 64位运行时
require( = 如果未安装 VC++14（VC2015、2017、2019） 运行时，则安装，\n注意VC2015、2017、2019都是使用同一运行库
require(.(minorVersion,buildNumber)  = 可选在参数中指定最低 minorVersion 或 buildNumber,\n也可以直接在 minorVersion 中用字符串指定"2019","2017","2015"
require(.() = 如果未安装 VC++14（VC2015） 运行时，则安装
require(.("2017") = 如果未安装 VC++14（2017） 运行时，则安装
require(.("2019") = 如果未安装 VC++14（2019） 运行时，则安装
require64(.() = 如果未安装 VC++14（VC2015） 64位运行时，则安装
require64(.("2017") = 如果未安装 VC++14（2017） 64位运行时，则安装
require64(.("2019") = 如果未安装 VC++14（2019） 64位运行时，则安装
end intellisense**/