package de.tobias.playpad.server.settings

import java.io.IOException
import java.lang.reflect.Modifier
import java.nio.file.{Files, Path}
import java.util.Properties

/**
 * Created by tobias on 05.02.17.
 */
class PropertiesSettingsHandler extends SettingsLoader with SettingsSaver {

	@throws[IOException]
	override def load(path: Path): Settings = {
		val properties = new Properties()
		properties.load(Files.newBufferedReader(path))

		val settings = new Settings()
		classOf[Settings].getDeclaredFields
			.filter(f => !Modifier.isTransient(f.getModifiers))
			.filter(f => properties.containsKey(f.getName))
			.foreach(f => {
				f.setAccessible(true)
				if (f.getType == Integer.TYPE) {
					f.setInt(settings, properties.getProperty(f.getName).toInt)
				} else {
					f.set(settings, properties.getProperty(f.getName))
				}
			})
		settings
	}

	@throws[IOException]
	override def save(settings: Settings, path: Path): Unit = {
		val properties = new Properties()

		classOf[Settings].getDeclaredFields
			.filter(f => !Modifier.isTransient(f.getModifiers))
			.foreach(f => {
				f.setAccessible(true)
				properties.setProperty(f.getName, f.get(settings).toString)
			})

		properties.store(Files.newOutputStream(path), "Settings")
	}
}