//
//  NutritionInsertionEventDTOMapper.swift
//  Plugin
//
//  Created by Francisco Guerrero Escamilla on 24/02/26.
//  Copyright © 2026 Max Lynch. All rights reserved.
//

import Foundation
import RookSDK

struct NutritionInsertionEventDTOMapper {

  private let dateISOFormatterDateLocal: DateFormatter = {
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: Locale.preferredLanguages[0])
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    return dateFormatter
  }()

  func toDomain(event: NutritionInsertionEventDTO) throws -> NutritionInsertionEvent {
    guard let parsedDate: Date = dateISOFormatterDateLocal.date(from: event.date) else {
      throw NSError(domain: "NutritionPlugin", code: 1, userInfo: [NSLocalizedDescriptionKey: "Invalid date format: \(event.date)"])
    }
    return NutritionInsertionEvent(
      name: event.name,
      quantity: NutritionInsertionEventQuantity(unit: event.quantity.unit, amount: event.quantity.amount),
      date: parsedDate,
      nutritionInsertionEnergyWaterDataRelated: event.nutritionInsertionEnergyWaterDataRelated.map {
        NutritionInsertionEnergyWaterDataRelated(
          dietaryKiloCaloriesEnergyConsumed: $0.dietaryKiloCaloriesEnergyConsumed,
          dietaryMilliLiterWater: $0.dietaryMilliLiterWater
        )
      },
      nutritionCarbohydratesDataRelated: event.nutritionCarbohydratesDataRelated.map {
        NutritionCarbohydratesDataRelated(
          dietaryGramCarbohydrates: $0.dietaryGramCarbohydrates,
          dietaryGramFiber: $0.dietaryGramFiber,
          dietaryGramSugar: $0.dietaryGramSugar
        )
      },
      nutritionFatsDataRelated: event.nutritionFatsDataRelated.map {
        NutritionFatsDataRelated(
          dietaryGramFatTotal: $0.dietaryGramFatTotal,
          dietaryGramFatSaturated: $0.dietaryGramFatSaturated,
          dietaryGramFatMonounsaturated: $0.dietaryGramFatMonounsaturated,
          dietaryGramFatPolyunsaturated: $0.dietaryGramFatPolyunsaturated
        )
      },
      nutritionProteinDataRelated: event.nutritionProteinDataRelated.map {
        NutritionProteinDataRelated(
          dietaryGramProtein: $0.dietaryGramProtein,
          dietaryMilliGramCholesterol: $0.dietaryMilliGramCholesterol
        )
      },
      nutritionVitaminsDataRelated: event.nutritionVitaminsDataRelated.map {
        NutritionVitaminsDataRelated(
          dietaryMicroGramVitaminA: $0.dietaryMicroGramVitaminA,
          dietaryMilliGramVitaminB6: $0.dietaryMilliGramVitaminB6,
          dietaryMicroGramVitaminB12: $0.dietaryMicroGramVitaminB12,
          dietaryMilliGramVitaminC: $0.dietaryMilliGramVitaminC,
          dietaryMicroGramVitaminD: $0.dietaryMicroGramVitaminD,
          dietaryMilliGramVitaminE: $0.dietaryMilliGramVitaminE,
          dietaryMicroGramVitaminK: $0.dietaryMicroGramVitaminK,
          dietaryMilliGramThiamin: $0.dietaryMilliGramThiamin,
          dietaryMilliGramRiboflavin: $0.dietaryMilliGramRiboflavin,
          dietaryMilliGramNiacin: $0.dietaryMilliGramNiacin,
          dietaryMilliGramPantothenicAcid: $0.dietaryMilliGramPantothenicAcid,
          dietaryMicroGramFolate: $0.dietaryMicroGramFolate,
          dietaryMicroGramBiotin: $0.dietaryMicroGramBiotin
        )
      },
      nutritionMineralDataRelated: event.nutritionMineralDataRelated.map {
        NutritionMineralDataRelated(
          dietaryMilliGramsCalcium: $0.dietaryMilliGramsCalcium,
          dietaryMilliGramsChloride: $0.dietaryMilliGramsChloride,
          dietaryMilliGramsChromium: $0.dietaryMilliGramsChromium,
          dietaryMilliGramsCopper: $0.dietaryMilliGramsCopper,
          dietaryMilliGramsIodine: $0.dietaryMilliGramsIodine,
          dietaryMilliGramsIron: $0.dietaryMilliGramsIron,
          dietaryMilliGramsMagnesium: $0.dietaryMilliGramsMagnesium,
          dietaryMilliGramsManganese: $0.dietaryMilliGramsManganese,
          dietaryMilliGramsMolybdenum: $0.dietaryMilliGramsMolybdenum,
          dietaryMilliGramsPhosphorus: $0.dietaryMilliGramsPhosphorus,
          dietaryMilliGramsPotassium: $0.dietaryMilliGramsPotassium,
          dietaryMilliGramsSelenium: $0.dietaryMilliGramsSelenium,
          dietaryMilliGramsSodium: $0.dietaryMilliGramsSodium,
          dietaryMilliGramsZinc: $0.dietaryMilliGramsZinc
        )
      }
    )
  }
}
