def debug = false
def stageName = ''
def git_link
def script_git = 'https://git.psychobox.org/psycho/owrt_build_script.git'
def git_folder = 'openwrt'
def script_folder = 'owrt_build_script'
def config_path = script_folder + '/configs/'
def patch_path = script_folder + '/patches/'
def scripts_path = script_folder + '/scripts/'
def patch = patch_path + 'tl-wr841_16m.patch'
def sftp_host = ''
def sftp_user = ''
//def sftp_passwd = ''
def sftp_path = '/jenkins/owrt/'
def isBuildNeeded = false
def deleteUnbuild = true
def pre_clean = true
def post_clean = false
def bin_path = 'bin'
def verbose = false
def single_core = false
def verbose_str = ''
def core_count_str = '$((`nproc` + 1))'
def statusCode = 0


if(params.DEBUG)
{
   debug = true
}
if(params.GIT)
{
	git_link = params.GIT
}
if(params.SFTP_HOST)
{
	sftp_host = params.SFTP_HOST
}
if(params.SFTP_USER)
{
	sftp_user = params.SFTP_USER
}
if(params.SFTP_PATH)
{
	sftp_path = params.SFTP_PATH
}
if(params.KNOWN_HOSTS)
{
	known_hosts = params.KNOWN_HOSTS
}
if(params.DeleteUnbuild)
{
	deleteUnbuild = params.DeleteUnbuild
}
if(params.PRE_CLEAN)
{
	pre_clean = params.PRE_CLEAN
}
if(params.POST_CLEAN)
{
	post_clean = params.POST_CLEAN
}
if(params.BIN_PATH)
{
	bin_path = params.BIN_PATH
}
if(params.VERBOSE)
{
	verbose = params.VERBOSE
}
if(params.SINGLE_CORE)
{
	single_core = params.SINGLE_CORE
}

def printDebug(msg)
{
    println 'DEBUG: ' + msg
}


printDebug(currentBuild.id.toString())
printDebug(JOB_NAME)
if(verbose)
{
	verbose_str = ' V=sc'
}
if(single_core)
{
	core_count_str = '1'
}


node('test')
{

	try
	{
		checkout()
		if(isBuildNeeded)
		{
			pre_build()
			build()
		}
	}
	catch (e)
	{
		postFailure(e)
	}
	finally
	{
		post_build()
	}



	def checkout()
	{
		stage('checkout')
		{
			if(pre_clean)
			{
				cleanWs()
			}
			sh label: 'checkout_configs', script: 'git clone ' + script_git + ' ' + script_folder
			sh label: 'checkout_openwrt', script: 'git clone ' + git_link + ' ' + git_folder
			def ret = sh label: 'is_build_needed', script: 'set +x; python ' + scripts_path + 'sftp_test.py -a ' + sftp_host + ' -u ' + sftp_user + ' -p ' + params.SFTP_PASSWD + ' -g ' + git_folder + ' -f ' + scripts_path + known_hosts + ' -l ' + sftp_path + '; set -x', returnStdout: true
			if(ret.trim().equalsIgnoreCase('True'))
			{
				isBuildNeeded = true
			}
		}
	}

	def pre_build()
	{
		stage('pre-build')
		{
			sh label: 'patch_sources', script: 'cd ' + git_folder + '; patch -p1 < ../' + patch
			sh label: 'feeds_update', script: 'cd ' + git_folder + '; ./scripts/feeds update -a'
			sh label: 'feeds_install', script: 'cd ' + git_folder + '; ./scripts/feeds install -a'
		}
	}

	def build()
	{
		stage('build')
		{
			sh label: 'copy_config', script: 'cp ' + config_path + 'tl_wr841_config ' + git_folder + '/.config'
			try
			{
				statusCode = sh label: 'build', script: 'cd ' + git_folder + '; make defconfig; make download; make -j$((`nproc` + 1))', returnStatus:true
			}
			catch (e)
			{
				printDebug(e)
				printDebug('multicore build failed -> trying to build verbosely on a single core')
				//sh label: 'build', script: 'cd ' + git_folder + '; make defconfig; make download; make -j1 V=sc'
			}
			finally
			{
				//empty
			}
		}
			
		stage('move_bin_to_ftp')
		{
			sh label: 'copy_binaries', script: 'python ' + scripts_path + 'sftp_test.py -a ' + sftp_host + ' -u ' + sftp_user + ' -p ' + params.SFTP_PASSWD + ' -g ' + git_folder + ' -f ' + scripts_path + known_hosts + ' -l ' + sftp_path + ' -c ' + bin_path
		}
	}
		
	def post_build()
	{ 
		if(post_clean)
		{
			cleanWs()
		}

		if((!isBuildNeeded && deleteUnbuild))
		{
			//if no build is needed, then the last build is deleted and the next build number is set to previous build number
			
			def jobName = JOB_NAME
			def job = Jenkins.instance.getItem(jobName)
			job.getLastBuild().delete()
			//printDebug('NUMBER:' + job.nextBuildNumber)
			//logger.printInfo('job is getting deleted ' + currentBuild.id.toString())//job.nextBuildNumber)
			//job.nextBuildNumber -= 1 //updateNextBuildNumber(job.getNextBuildNumber() - 1)      //resetting next build number does not work. if done, the next build start will do nothing
			//job.saveNextBuildNumber()
			//job.updateNextBuildNumber(job.nextBuildNumber - 1)
			//printDebug('NUMBER_after:' + job.nextBuildNumber)
			job.save()
		}
	}
	
}