package com.smkituilibrary.serializers import com.google.gson.JsonElement import com.google.gson.JsonObject import com.google.gson.JsonSerializationContext import com.google.gson.JsonSerializer import com.sency.smkitui.model.ExerciseData import com.sency.smkitui.model.Feedback import com.sency.smkitui.model.ScoringParamsData import com.sency.smkitui.model.UserData import com.sency.smkitui.model.WorkoutSummaryData import com.sency.smkitui.model.workoutConfig.WorkoutConfig import com.sency.smkitui.model.workoutConfig.WorkoutConfigModel import com.smkituilibrary.model.WFPExerciseData import com.smkituilibrary.model.WFPSummary import java.lang.reflect.Type class WorkoutSummarySerializer : JsonSerializer { override fun serialize( src: WorkoutSummaryData, typeOfSrc: Type?, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("workout_details", context.serialize(src.workoutConfig)) add("language", context.serialize(src.language)) add("user_data", context.serialize(src.userData)) add("session_id", context.serialize(src.sessionId)) add("type", context.serialize(src.activityType)) add("start_time", context.serialize(src.startTime)) add("end_time", context.serialize(src.endTime)) add("total_time", context.serialize(src.totalTime.toDouble())) add("total_score", context.serialize(src.totalScore.toInt())) add("total_score_segmented", context.serialize(src.totalScoreSegmented.toInt())) add("exercises", context.serialize(src.exercises)) } } } class WFPSummarySerializer : JsonSerializer { override fun serialize( src: WFPSummary, typeOfSrc: Type?, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("workout_details", context.serialize(src.workoutConfig)) add("language", context.serialize(src.langauge)) add("user_data", context.serialize(src.userData)) add("session_id", context.serialize(src.sessionId)) add("type", context.serialize(src.activityType)) add("start_time", context.serialize(src.startTime)) add("end_time", context.serialize(src.endTime)) add("total_time", context.serialize(src.totalTime.toDouble())) add("total_score", context.serialize(src.totalScore.toInt())) add("exercises", context.serialize(src.exercises)) } } } class WorkoutConfigSerializer: JsonSerializer { override fun serialize( src: WorkoutConfigModel, typeOfSrc: Type?, context: JsonSerializationContext? ): JsonElement { return src.convertToJson() } } class UserDataSerializer: JsonSerializer { override fun serialize( src: UserData, typeOfSrc: Type?, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("age", context.serialize(src.age)) add("gender", context.serialize(src.gender)) add("email", context.serialize(src.email)) } } } class ExerciseDataSerializer : JsonSerializer { override fun serialize( src: ExerciseData, typeOfSrc: Type?, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("activity_type", context.serialize(src.activityType)) src.totalScore?.let { add("total_score", context.serialize(it)) } src.totalScoreSegmented?.let { add("total_score_segmented", context.serialize(it)) } src.performanceScore?.let { add("performance_score", context.serialize(it)) } src.performanceScoreSegmented?.let { add("performance_score_segmented", context.serialize(it)) } src.techniqueScore?.let { add("technique_score", context.serialize(it)) } src.techniqueScoreSegmented?.let { add("technique_score_segmented", context.serialize(it)) } src.repsPerformed?.let { add("reps_performed", context.serialize(it)) } src.repsPerformedPerfect?.let { add("reps_performed_perfect", context.serialize(it)) } src.timeInPosition?.let { add("time_in_position", context.serialize(it)) } src.timeInPositionPerfect?.let { add("time_in_position_perfect", context.serialize(it)) } src.peakRangeOfMotion?.let { add("peak_range_of_motion_score", context.serialize(it)) } add("user_data", context.serialize(src.userData)) add("session_id", context.serialize(src.sessionId)) add("start_time", context.serialize(src.startTime)) add("end_time", context.serialize(src.endTime)) add("feedback", context.serialize(src.feedbacks)) add("exercise_id", context.serialize(src.exerciseId)) add("total_time", context.serialize(src.totalTime)) val strings = src.uiElements.map { it.name } add("ui_elements", context.serialize(strings)) add("instruction_video", context.serialize(src.instructionVideo)) add("voice_outro", context.serialize(src.voicOutro)) add("voice_intro", context.serialize(src.voiceIntro)) add("pretty_name", context.serialize(src.prettyName)) add("score_params", context.serialize(src.scoringParamsData)) } } } class WFPExerciseDataSerializer : JsonSerializer { override fun serialize( src: WFPExerciseData, typeOfSrc: Type?, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("activity_type", context.serialize(src.activityType)) add("start_time", context.serialize(src.startTime)) add("end_time", context.serialize(src.endTime)) add("exercise_info", JsonObject().apply { add("pretty_name", context.serialize(src.prettyName)) add("exercise_id", context.serialize(src.exerciseId)) add("total_time", context.serialize(src.totalTime)) add("scoring_params", context.serialize(src.scoringParamsData)) val strings = src.uiElements.map { it.name } add("ui_elements", context.serialize(strings)) add("instruction_video", context.serialize(src.instructionVideo)) add("voice_intro", context.serialize(src.voiceIntro)) }) add("feedback", context.serialize(src.feedbacks)) src.totalScore?.let { add("total_score", context.serialize(it)) } src.performanceScore?.let { add("performance_score", context.serialize(it)) } src.techniqueScore?.let { add("technique_score", context.serialize(it)) } src.repsPerformed?.let { add("reps_performed", context.serialize(it)) } src.repsPerformedPerfect?.let { add("reps_performed_perfect", context.serialize(it)) } src.timeInPosition?.let { add("time_in_position", context.serialize(it)) } src.timeInPositionPerfect?.let { add("time_in_position_perfect", context.serialize(it)) } src.peakRangeOfMotion?.let { add("peak_range_of_motion_score", context.serialize(it)) } add("session_id", context.serialize(src.sessionId)) add("user_data", context.serialize(src.userData)) } } } class ScoringParamsDataSerializer : JsonSerializer { override fun serialize( src: ScoringParamsData, typeOfSrc: Type, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("score_factor", context.serialize(src.scoreFactor)) add("type", context.serialize(src.type)) add("target_time", context.serialize(src.targetTime)) add("target_reps", context.serialize(src.targetReps)) add("pass_criteria", context.serialize(src.passCriteria)) add("target_rom", context.serialize(src.targetRom)) } } } class FeedbackSerializer : JsonSerializer { override fun serialize( src: Feedback, typeOfSrc: Type, context: JsonSerializationContext ): JsonElement { return JsonObject().apply { add("feedback_type", context.serialize(src.feedbackType)) add("occurrence_rate", context.serialize(src.occurrenceRate.toString())) add("description", context.serialize(src.description)) } } }