import Foundation
import StoreKit

struct PurchaseKitPeriod: Encodable {
  let value: Int
  let unit: String
  let localized: String
}

struct PurchaseKitSubscription: Encodable {
  @Nullable var period: PurchaseKitPeriod?
}

@available(iOS 15.0, *)
func parseUnit(_ unit: Product.SubscriptionPeriod.Unit) -> String {
  switch unit {
  case .day:
    return "day"

  case .week:
    return "week"

  case .month:
    return "month"

  case .year:
    return "year"

  default:
    return "—"
  }
}

@available(iOS 15.0, *)
func parseLocalized(value: Int, unit: String) -> String {
  if value > 1 {
    return "/\(value) \(unit)s"
  }

  return "/\(unit)"
}

@available(iOS 15.0, *)
func parseSubscription(_ product: Product) -> PurchaseKitSubscription? {
  if let subscriptionPeriod = product.subscription?.subscriptionPeriod {
    let value = subscriptionPeriod.value
    let unit = parseUnit(subscriptionPeriod.unit)

    let period = PurchaseKitPeriod(
      value: value,
      unit: unit,
      localized: parseLocalized(value: value, unit: unit)
    )

    return PurchaseKitSubscription(period: period)
  } else {
    return nil
  }
}
