//
//  PhysicalSummaryDictionaryMapper.swift
//  Plugin
//
//  Created by Francisco Guerrero Escamilla on 07/10/25.
//  Copyright © 2025 Max Lynch. All rights reserved.
//

import Foundation
import RookSDK

struct PhysicalSummaryDictionaryMapper {

  // MARK:  Properties

  private let dateHelper: DateHelper = DateHelper()

  // MARK:  Implementation

  func map(_ summary: RookPhysicalSummary) -> [String: Any?] {
    var dictionary: [String: Any?] = [:]
    dictionary.updateValue(summary.dateTime, forKey: "dateTime")
    dictionary.updateValue(summary.physicalHealthScore, forKey: "physicalHealthScore")
    dictionary.updateValue(summary.stepsPerDayNumber, forKey: "stepsPerDayNumber")
    dictionary.updateValue(summary.stepsGranularDataStepsPerHr?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "intervalDurationSeconds": $0.intervalDurationSeconds,
        "steps": $0.steps
      ]
    }), forKey: "stepsGranularDataStepsPerHr")
    dictionary.updateValue(summary.activeStepsPerDayNumber, forKey: "activeStepsPerDayNumber")
    dictionary.updateValue(summary.activeStepsGranularDataStepsPerHr?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "intervalDurationSeconds": $0.intervalDurationSeconds,
        "steps": $0.steps
      ]
    }), forKey: "activeStepsGranularDataStepsPerHr")
    dictionary.updateValue(summary.walkedDistanceMeters, forKey: "walkedDistanceMeters")
    dictionary.updateValue(summary.traveledDistanceMeters, forKey: "traveledDistanceMeters")
    dictionary.updateValue(summary.cyclingDistanceMeters, forKey: "cyclingDistanceMeters")
    dictionary.updateValue(summary.traveledDistanceGranularDataMeters?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "intervalDurationSeconds": $0.intervalDurationSeconds,
        "traveledDistanceMeters": $0.traveledDistanceMeters,
      ]
    }), forKey: "traveledDistanceGranularDataMeters")
    dictionary.updateValue(summary.floorsClimbedNumber, forKey: "floorsClimbedNumber")
    dictionary.updateValue(summary.floorsClimbedGranularDataFloors?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "intervalDurationSeconds": $0.intervalDurationSeconds,
        "floorsClimbed": $0.floorsClimbed
      ]
    }), forKey: "floorsClimbedGranularDataFloors")
    dictionary.updateValue(summary.elevationAvgAltitudeMeters, forKey: "elevationAvgAltitudeMeters")
    dictionary.updateValue(summary.elevationMinimumAltitudeMeters, forKey: "elevationMinimumAltitudeMeters")
    dictionary.updateValue(summary.elevationMaxAltitudeMeters, forKey: "elevationMaxAltitudeMeters")
    dictionary.updateValue(summary.elevationLossActualAltitudeMeters, forKey: "elevationLossActualAltitudeMeters")
    dictionary.updateValue(summary.elevationGainActualAltitudeMeters, forKey: "elevationGainActualAltitudeMeters")
    dictionary.updateValue(summary.elevationPlannedGainMeters, forKey: "elevationPlannedGainMeters")
    dictionary.updateValue(summary.elevationGranularDataMeters?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "intervalDurationSeconds": $0.intervalDurationSeconds,
        "elevationChange": $0.elevationChange
      ]
    }), forKey: "elevationGranularDataMeters")
    dictionary.updateValue(summary.swimmingStrokesNumber, forKey: "swimmingStrokesNumber")
    dictionary.updateValue(summary.swimmingNumLapsNumber, forKey: "swimmingNumLapsNumber")
    dictionary.updateValue(summary.swimmingPoolLengthMeters, forKey: "swimmingPoolLengthMeters")
    dictionary.updateValue(summary.swimmingTotalDistanceMeters, forKey: "swimmingTotalDistanceMeters")
    dictionary.updateValue(summary.swimmingDistanceGranularDataMeters?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "intervalDurationSeconds": $0.intervalDurationSeconds,
        "swimmingDistanceMeters": $0.swimmingDistanceMeters
      ]
    }), forKey: "swimmingDistanceGranularDataMeters")
    dictionary.updateValue(summary.saturationAvgPercentage, forKey: "saturationAvgPercentage")
    dictionary.updateValue(summary.saturationGranularDataPercentage?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "saturationPercentage": $0.saturationPercentage
      ]
    }), forKey: "saturationGranularDataPercentage")
    dictionary.updateValue(summary.vo2MaxMlPerMinPerKg, forKey: "vo2MaxMlPerMinPerKg")
    dictionary.updateValue(summary.vo2GranularDataLiterPerMin?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "vo2MlPerMinPerKg": $0.vo2MlPerMinPerKg
      ]
    }), forKey: "vo2GranularDataLiterPerMin")
    dictionary.updateValue(summary.activeSeconds, forKey: "activeSeconds")
    dictionary.updateValue(summary.restSeconds, forKey: "restSeconds")
    dictionary.updateValue(summary.lowIntensitySeconds, forKey: "lowIntensitySeconds")
    dictionary.updateValue(summary.moderateIntensitySeconds, forKey: "moderateIntensitySeconds")
    dictionary.updateValue(summary.vigorousIntensitySeconds, forKey: "vigorousIntensitySeconds")
    dictionary.updateValue(summary.inactivitySeconds, forKey: "inactivitySeconds")
    dictionary.updateValue(summary.continuousInactivePeriodsNumber, forKey: "continuousInactivePeriodsNumber")
    dictionary.updateValue(summary.activityLevelGranularDataNumber?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "activityLevel": $0.activityLevel
      ]
    }), forKey: "activityLevelGranularDataNumber")
    dictionary.updateValue(summary.caloriesNetIntakeKilocalories, forKey: "caloriesNetIntakeKilocalories")
    dictionary.updateValue(summary.caloriesExpenditureKilocalories, forKey: "caloriesExpenditureKilocalories")
    dictionary.updateValue(summary.caloriesNetActiveKilocalories, forKey: "caloriesNetActiveKilocalories")
    dictionary.updateValue(summary.caloriesBasalMetabolicRateKilocalories, forKey: "caloriesBasalMetabolicRateKilocalories")
    dictionary.updateValue(summary.hrMaxBPM, forKey: "hrMaxBPM")
    dictionary.updateValue(summary.hrMinimumBPM, forKey: "hrMinimumBPM")
    dictionary.updateValue(summary.hrAvgBPM, forKey: "hrAvgBPM")
    dictionary.updateValue(summary.hrRestingBPM, forKey: "hrRestingBPM")
    dictionary.updateValue(summary.hrGranularDataBPM?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "hrBPM": $0.hrBPM
      ]
    }), forKey: "hrGranularDataBPM")
    dictionary.updateValue(summary.hrvAvgRmssdNumber, forKey: "hrvAvgRmssdNumber")
    dictionary.updateValue(summary.hrvAvgSdnnNumber, forKey: "hrvAvgSdnnNumber")
    dictionary.updateValue(summary.hrvSdnnGranularDataNumber?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "hrvSDNN": $0.hrvSDNN
      ]
    }), forKey: "hrvSdnnGranularDataNumber")
    dictionary.updateValue(summary.hrvRmssdGranularDataNumber?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "hrvRmssd": $0.hrvRmssd
      ]
    }), forKey: "hrvRmssdGranularDataNumber")
    dictionary.updateValue(summary.stressAtRESTDurationSeconds, forKey: "stressAtRESTDurationSeconds")
    dictionary.updateValue(summary.stressDurationSeconds, forKey: "stressDurationSeconds")
    dictionary.updateValue(summary.lowStressDurationSeconds, forKey: "lowStressDurationSeconds")
    dictionary.updateValue(summary.mediumStressDurationSeconds, forKey: "mediumStressDurationSeconds")
    dictionary.updateValue(summary.highStressDurationSeconds, forKey: "highStressDurationSeconds")
    dictionary.updateValue(summary.stressGranularDataScoreNumber?.map({
      [
        "dateTime": dateHelper.getISO8601StringDate(date: $0.dateTime),
        "stressScore": $0.stressScore
      ]
    }), forKey: "stressGranularDataScoreNumber")
    dictionary.updateValue(summary.stressAvgLevelNumber, forKey: "stressAvgLevelNumber")
    dictionary.updateValue(summary.stressMaxLevelNumber, forKey: "stressMaxLevelNumber")
    dictionary.updateValue(summary.walkingSpeed, forKey: "walkingSpeed")
    dictionary.updateValue(summary.walkingStepLength, forKey: "walkingStepLength")
    dictionary.updateValue(summary.runningPower, forKey: "runningPower")
    dictionary.updateValue(summary.runningSpeed, forKey: "runningSpeed")
    return dictionary
  }
}
