package de.onyxbits.dummydroid;

import java.util.Arrays;
import java.util.Date;
import java.util.TimeZone;

import com.akdeniz.googleplaycrawler.GooglePlay.AndroidBuildProto;
import com.akdeniz.googleplaycrawler.GooglePlay.AndroidCheckinProto;
import com.akdeniz.googleplaycrawler.GooglePlay.AndroidCheckinRequest;
import com.akdeniz.googleplaycrawler.GooglePlay.DeviceConfigurationProto;

/**
 * A datacapsule
 *
 * @author patrick
 *
 */
public class FormData {

	private AndroidCheckinRequest.Builder androidCheckinRequestBuilder;
	private AndroidCheckinProto.Builder androidCheckinProtoBuilder;
	private DeviceConfigurationProto.Builder deviceConfigurationProtoBuilder;
	private AndroidBuildProto.Builder androidBuildProtoBuilder;

	private String username = "";
	private String password = "";

	public FormData() {
	}

	public AndroidCheckinRequest assemble() {
		getAndroidBuildProtoBuilder();
		getAndroidCheckinProtoBuilder();
		getAndroidCheckinRequestBuilder();
		return androidCheckinRequestBuilder
				.setCheckin(androidCheckinProtoBuilder.setBuild(androidBuildProtoBuilder))
				.setDeviceConfiguration(getDeviceConfigurationProtoBuilder()).setFragment(0).build();
	}

	/**
	 * @return the androidCheckinRequestBuilder
	 */
	public AndroidCheckinRequest.Builder getAndroidCheckinRequestBuilder() {
		if (androidCheckinRequestBuilder == null) {
			String tz = TimeZone.getDefault().getID();
			androidCheckinRequestBuilder = AndroidCheckinRequest.newBuilder().setId(0).setVersion(3)
					.setTimeZone(tz);
		}
		return androidCheckinRequestBuilder;
	}

	/**
	 * @return the androidCheckinProtoBuilder
	 */
	public AndroidCheckinProto.Builder getAndroidCheckinProtoBuilder() {
		if (androidCheckinProtoBuilder == null) {
			androidCheckinProtoBuilder = AndroidCheckinProto.newBuilder();
		}
		return androidCheckinProtoBuilder;
	}

	/**
	 * @param androidCheckinRequestBuilder
	 *          the androidCheckinRequestBuilder to set
	 */
	public void setAndroidCheckinRequestBuilder(
			AndroidCheckinRequest.Builder androidCheckinRequestBuilder) {
		this.androidCheckinRequestBuilder = androidCheckinRequestBuilder;
	}

	/**
	 * @param androidCheckinProtoBuilder
	 *          the androidCheckinProtoBuilder to set
	 */
	public void setAndroidCheckinProtoBuilder(AndroidCheckinProto.Builder androidCheckinProtoBuilder) {
		this.androidCheckinProtoBuilder = androidCheckinProtoBuilder;
	}

	/**
	 * @return the deviceConfigurationProtoBuilder
	 */
	public DeviceConfigurationProto.Builder getDeviceConfigurationProtoBuilder() {
		if (deviceConfigurationProtoBuilder == null) {
			deviceConfigurationProtoBuilder = DeviceConfigurationProto
					.newBuilder()
					.setTouchScreen(3)
					.setKeyboard(1)
					.setNavigation(1)
					.setScreenLayout(2)
					.setHasHardKeyboard(false)
					.setHasFiveWayNavigation(false)
					.setScreenDensity(560)
					.setScreenWidth(1440)
					.setScreenHeight(2560)
					.setGlEsVersion(196609)
					.addAllSystemSharedLibrary(
							Arrays.asList("android.test.runner", "com.android.future.usb.accessory", "com.android.location.provider",
									"com.android.media.remotedisplay", "com.android.mediadrm.signer", "com.android.nfc_extras", "com.google.android.camera.experimental2015",
									"com.google.android.dialer.support", "com.google.android.maps", "com.google.android.media.effects",
									"com.google.widevine.software.drm", "javax.obex"))
					.addAllSystemAvailableFeature(
							Arrays.asList("android.hardware.audio.low_latency", "android.hardware.audio.output", "android.hardware.audio.pro", "android.hardware.microphone",
									"android.hardware.output", "android.hardware.bluetooth", "android.hardware.bluetooth_le", "android.hardware.camera",
									"android.hardware.camera.any", "android.hardware.camera.autofocus", "android.hardware.camera.flash", "android.hardware.camera.front",
									"android.hardware.camera.level.full", "android.hardware.camera.capability.manual_sensor", "android.hardware.camera.capability.manual_post_processing", "android.hardware.camera.capability.raw",
									"android.hardware.consumerir", "android.hardware.ethernet", "android.hardware.fingerprint", "android.hardware.location",
									"android.hardware.location.network", "android.hardware.location.gps", "android.hardware.microphone", "android.hardware.nfc",
									"android.hardware.nfc.hce", "android.hardware.sensor.accelerometer", "android.hardware.sensor.barometer", "android.hardware.sensor.compass",
									"android.hardware.sensor.gyroscope", "android.hardware.sensor.hifi_sensors", "android.hardware.sensor.light", "android.hardware.sensor.proximity",
									"android.hardware.sensor.stepcounter", "android.hardware.sensor.stepdetector", "android.hardware.screen.landscape", "android.hardware.screen.portrait",
									"android.hardware.telephony", "android.hardware.telephony.cdma", "android.hardware.telephony.gsm", "android.hardware.faketouch",
									"android.hardware.usb.host", "android.hardware.usb.accessory", "android.hardware.wifi", "android.hardware.wifi.direct",
									"android.hardware.touchscreen", "android.hardware.touchscreen.multitouch", "android.hardware.touchscreen.multitouch.distinct", "android.hardware.touchscreen.multitouch.jazzhand",
									"android.software.app_widgets", "android.software.backup", "android.software.connectionservice", "android.software.device_admin",
									"android.software.home_screen", "android.software.input_methods", "android.software.live_wallpaper", "android.software.managed_users",
									"android.software.midi", "android.software.print", "android.software.sip", "android.software.sip.voip",
									"android.software.verified_boot", "android.software.voice_recognizers", "android.software.webview", "com.google.android.feature.GOOGLE_BUILD",
									"com.google.android.feature.GOOGLE_EXPERIENCE", "com.google.android.feature.EXCHANGE_6_2", "com.nxp.mifare"))
					.addAllNativePlatform(Arrays.asList("x86_64", "x86", "arm64-v8a", "armeabi-v7a", "armeabi"))
					.addAllSystemSupportedLocale(
							Arrays.asList("af", "af_ZA", "am", "am_ET", "ar", "ar_EG", "bg", "bg_BG", "ca",
									"ca_ES", "cs", "cs_CZ", "da", "da_DK", "de", "de_AT", "de_CH", "de_DE", "de_LI",
									"el", "el_GR", "en", "en_AU", "en_CA", "en_GB", "en_NZ", "en_SG", "en_US", "es",
									"es_ES", "es_US", "fa", "fa_IR", "fi", "fi_FI", "fr", "fr_BE", "fr_CA", "fr_CH",
									"fr_FR", "hi", "hi_IN", "hr", "hr_HR", "hu", "hu_HU", "in", "in_ID", "it",
									"it_CH", "it_IT", "iw", "iw_IL", "ja", "ja_JP", "ko", "ko_KR", "lt", "lt_LT",
									"lv", "lv_LV", "ms", "ms_MY", "nb", "nb_NO", "nl", "nl_BE", "nl_NL", "pl",
									"pl_PL", "pt", "pt_BR", "pt_PT", "rm", "rm_CH", "ro", "ro_RO", "ru", "ru_RU",
									"sk", "sk_SK", "sl", "sl_SI", "sr", "sr_RS", "sv", "sv_SE", "sw", "sw_TZ", "th",
									"th_TH", "tl", "tl_PH", "tr", "tr_TR", "ug", "ug_CN", "uk", "uk_UA", "vi",
									"vi_VN", "zh_CN", "zh_TW", "zu", "zu_ZA"))
					.addAllGlExtension(
							Arrays.asList("GL_EXT_debug_marker", "GL_EXT_discard_framebuffer",
									"GL_EXT_multi_draw_arrays", "GL_EXT_shader_texture_lod",
									"GL_EXT_texture_format_BGRA8888", "GL_IMG_multisampled_render_to_texture",
									"GL_IMG_program_binary", "GL_IMG_read_format", "GL_IMG_shader_binary",
									"GL_IMG_texture_compression_pvrtc", "GL_IMG_texture_format_BGRA8888",
									"GL_IMG_texture_npot", "GL_IMG_vertex_array_object", "GL_OES_EGL_image",
									"GL_OES_EGL_image_external", "GL_OES_blend_equation_separate",
									"GL_OES_blend_func_separate", "GL_OES_blend_subtract", "GL_OES_byte_coordinates",
									"GL_OES_compressed_ETC1_RGB8_texture", "GL_OES_compressed_paletted_texture",
									"GL_OES_depth24", "GL_OES_depth_texture", "GL_OES_draw_texture",
									"GL_OES_egl_sync", "GL_OES_element_index_uint", "GL_OES_extended_matrix_palette",
									"GL_OES_fixed_point", "GL_OES_fragment_precision_high",
									"GL_OES_framebuffer_object", "GL_OES_get_program_binary", "GL_OES_mapbuffer",
									"GL_OES_matrix_get", "GL_OES_matrix_palette", "GL_OES_packed_depth_stencil",
									"GL_OES_point_size_array", "GL_OES_point_sprite", "GL_OES_query_matrix",
									"GL_OES_read_format", "GL_OES_required_internalformat", "GL_OES_rgb8_rgba8",
									"GL_OES_single_precision", "GL_OES_standard_derivatives", "GL_OES_stencil8",
									"GL_OES_stencil_wrap", "GL_OES_texture_cube_map", "GL_OES_texture_env_crossbar",
									"GL_OES_texture_float", "GL_OES_texture_half_float",
									"GL_OES_texture_mirrored_repeat", "GL_OES_vertex_array_object",
									"GL_OES_vertex_half_float"));
		}
		return deviceConfigurationProtoBuilder;
	}

	/**
	 * @param deviceConfigurationProtoBuilder
	 *          the deviceConfigurationProtoBuilder to set
	 */
	public void setDeviceConfigurationProtoBuilder(
			DeviceConfigurationProto.Builder deviceConfigurationProtoBuilder) {
		this.deviceConfigurationProtoBuilder = deviceConfigurationProtoBuilder;
	}

	/**
	 * @return the androidBuildProtoBuilder
	 */
	public AndroidBuildProto.Builder getAndroidBuildProtoBuilder() {
		if (androidBuildProtoBuilder == null) {
			androidBuildProtoBuilder = AndroidBuildProto.newBuilder().setTimestamp(
					new Date().getTime() / 1000);
		}
		return androidBuildProtoBuilder;
	}

	/**
	 * @param androidBuildProtoBuilder
	 *          the androidBuildProtoBuilder to set
	 */
	public void setAndroidBuildProtoBuilder(AndroidBuildProto.Builder androidBuildProtoBuilder) {
		this.androidBuildProtoBuilder = androidBuildProtoBuilder;
	}

	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * @param username the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}
}