import Foundation
import StoreKit

extension Date {
  var milliseconds: Int64 {
    return Int64((self.timeIntervalSince1970 * 1000.0).rounded())
  }
}

@available(iOS 15.0, *)
struct PurchaseKitTransaction: Encodable {
  let id: String
  let originalId: String
  let productId: String
  let environment: String
  let purchaseDate: Int64
  let originalPurchaseDate: Int64
  @Nullable var expirationDate: Int64?
  @Nullable var token: String?
  let quantity: Int
  let price: PurchaseKitPrice
}

@available(iOS 15.0, *)
func getEnvironment(_ transaction: Transaction) -> String {
  if #available(iOS 16.0, *) {
    return transaction.environment.rawValue.lowercased()
  } else {
    return transaction.environmentStringRepresentation.lowercased()
  }
}

@available(iOS 15.0, *)
func getCurrency(_ transaction: Transaction) -> String? {
  if #available(iOS 16.0, *) {
    return transaction.currency?.identifier ?? nil
  } else {
    return transaction.currencyCode ?? nil
  }
}

@available(iOS 15.0, *)
func parseTransaction(_ transaction: Transaction) -> PurchaseKitTransaction {
  let environment = getEnvironment(transaction)
  let currency = getCurrency(transaction)

  let price = PurchaseKitPrice(
    value: transaction.price ?? 0.00,
    currency: currency,
    localized: nil
  )

  return PurchaseKitTransaction(
    id: String(transaction.id),
    originalId: String(transaction.originalID),
    productId: transaction.productID,
    environment: environment,
    purchaseDate: transaction.purchaseDate.milliseconds,
    originalPurchaseDate: transaction.originalPurchaseDate.milliseconds,
    expirationDate: transaction.expirationDate?.milliseconds,
    token: nil,
    quantity: 1,
    price: price
  )
}
