import org.doomedsociety.gradlecpp.GradleCppUtils
import org.apache.commons.io.FilenameUtils

void _copyFileToDir(String from, String to) {
	if (!project.file(from).exists()) {
		println 'WARNING: Could not find: ' + from;
		return;
	}

	if (!project.file(to).exists()) {
		project.file(to).mkdirs();
	}

	def dst = new File(project.file(to), FilenameUtils.getName(from))
	GradleCppUtils.copyFile(project.file(from), dst, false)
}

void _copyFile(String from, String to) {
	if (!project.file(from).exists()) {
		println 'WARNING: Could not find: ' + from;
		return;
	}

	GradleCppUtils.copyFile(project.file(from), project.file(to), false)
}

task publishPrepareFiles {
	dependsOn ':flightrec/decoder:uberjar'
	doLast {
		def pubRootDir = project.file('publish/publishRoot')
		if (pubRootDir.exists()) {
			if (!pubRootDir.deleteDir()) {
				throw new RuntimeException("Failed to delete ${pubRootDir}")
			}
		}

		pubRootDir.mkdirs()
		project.file('publish/publishRoot/bin/win32/valve/dlls').mkdirs()
		project.file('publish/publishRoot/bin/linux32/valve/dlls').mkdirs()

		// bugfixed binaries
		_copyFile('publish/releaseRehldsFixes/swds.dll', 'publish/publishRoot/bin/win32/swds.dll')
		_copyFile('publish/releaseRehldsFixes/engine_i486.so', 'publish/publishRoot/bin/linux32/engine_i486.so')

		// dedicated binaries
		_copyFile('publish/hlds.exe', 'publish/publishRoot/bin/win32/hlds.exe')
		_copyFile('publish/hlds_linux', 'publish/publishRoot/bin/linux32/hlds_linux')

		// HLTV binaries
		_copyFile('publish/hltv.exe', 'publish/publishRoot/bin/win32/hltv.exe')
		_copyFile('publish/hltv', 'publish/publishRoot/bin/linux32/hltv')

		_copyFile('publish/core.dll', 'publish/publishRoot/bin/win32/core.dll')
		_copyFile('publish/core.so', 'publish/publishRoot/bin/linux32/core.so')

		_copyFile('publish/proxy.dll', 'publish/publishRoot/bin/win32/proxy.dll')
		_copyFile('publish/proxy.so', 'publish/publishRoot/bin/linux32/proxy.so')

		_copyFile('publish/demoplayer.dll', 'publish/publishRoot/bin/win32/demoplayer.dll')
		_copyFile('publish/demoplayer.so', 'publish/publishRoot/bin/linux32/demoplayer.so')

		_copyFile('publish/director.dll', 'publish/publishRoot/bin/win32/valve/dlls/director.dll')
		_copyFile('publish/director.so', 'publish/publishRoot/bin/linux32/valve/dlls/director.so')

		// FileSystem binaries
		_copyFile('publish/filesystem_stdio.dll', 'publish/publishRoot/bin/win32/filesystem_stdio.dll')
		_copyFile('publish/filesystem_stdio.so', 'publish/publishRoot/bin/linux32/filesystem_stdio.so')

		// hlsdk
		project.file('publish/publishRoot/hlsdk').mkdirs()
		copy {
			from 'rehlds/common'
			into 'publish/publishRoot/hlsdk/common'
		}
		copy {
			from 'rehlds/dlls'
			into 'publish/publishRoot/hlsdk/dlls'
		}
		copy {
			from 'rehlds/pm_shared'
			into 'publish/publishRoot/hlsdk/pm_shared'
		}
		copy {
			from 'rehlds/public'
			into 'publish/publishRoot/hlsdk/public'
			exclude '**/rehlds/*'
		}
		copy {
			from 'rehlds/public/rehlds'
			into 'publish/publishRoot/hlsdk/engine'
		}

		// flightrecorder
		def flightRecJarTask = project(':flightrec/decoder').tasks.getByName('uberjar')
		println flightRecJarTask
		println flightRecJarTask.class.name
		File flightRecJarFile = flightRecJarTask.archivePath
		project.file('publish/publishRoot/flighrec').mkdirs()
		GradleCppUtils.copyFile(flightRecJarFile, project.file('publish/publishRoot/flighrec/decoder.jar'), false)
		copy {
			from new File(project(':flightrec/decoder').projectDir, 'pub')
			into 'publish/publishRoot/flighrec'
		}
	}
}

task publishPackage(type: Zip, dependsOn: 'publishPrepareFiles') {
	baseName = "rehlds-dist-${project.version}"
	destinationDir file('publish')
	from 'publish/publishRoot'
}

publishing {
	publications {
		maven(MavenPublication) {
			version project.version
			artifact publishPackage

			pom.withXml {
				asNode().children().last() + {
					resolveStrategy = DELEGATE_FIRST
					name project.name
					description project.description
					properties {
						commitDate project.ext.rehldsVersionInfo.commitDate
						commitSHA project.ext.rehldsVersionInfo.commitSHA
					}

					//url github
					//scm {
					//	url "${github}.git"
					//	connection "scm:git:${github}.git"
					//}
					/*
					licenses {
						license {
							name 'The Apache Software License, Version 2.0'
							url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
							distribution 'repo'
						}
					}
					developers {
						developer {
							id 'dreamstalker'
							name 'dreamstalker'
						}
					}
					*/
				}
			}
		}
	}
}

Properties repoCreds = new Properties()
project.ext.repoCreds = repoCreds
if (file('repo_creds.properties').exists()) {
	println 'Loading maven repo credentials'
	file('repo_creds.properties').withReader('UTF-8', { Reader r ->
		repoCreds.load(r)
	})
}

publishing {
	repositories {
		maven {
			if (project.version.contains('dev')) {
				url "http://nexus.rehlds.org/nexus/content/repositories/rehlds-dev/"
			} else {
				url "http://nexus.rehlds.org/nexus/content/repositories/rehlds-releases/"
			}
			credentials {
				username repoCreds.getProperty('username')
				password repoCreds.getProperty('password')
			}
		}
	}
}

task doPublish {
	dependsOn 'publishPackage'
	if (repoCreds.getProperty('username') && repoCreds.getProperty('password')) {
		dependsOn 'publish'
		dependsOn ':flightrec/decoder_api:publish'
	}
}