import Foundation

@objc(CheckoutError)
public enum CheckoutError: Int, Error {
  // MARK: - Error cases

  case missingEnvironment = 1001
  case missingPublicKey   = 1002
  case missingPaymentSession = 1003
  case invalidPaymentSessionData = 1004
  case unknown = 1099
  case clearFailed = 3001
  case createFailed = 3002

  // MARK: - Convenience

  public var message: String {
    switch self {
    case .missingEnvironment:
      return "Initialization failed: Missing 'environment'."
    case .missingPublicKey:
      return "Initialization failed: Missing 'publicKey'."
    case .missingPaymentSession:
      return "Initialization failed: Missing 'paymentSession'."
    case .invalidPaymentSessionData:
      return "Initialization failed: Invalid 'paymentSession' object."
    case .unknown:
      return "An unknown error occurred."
    case .clearFailed:
      return "Failed to clear CheckoutComponents instance."
    case .createFailed:
      return "Failed to create CheckoutComponents component."
    }
  }

  public var nsError: NSError {
    return NSError(domain: "com.checkout.ReactNativeComponents", code: rawValue, userInfo: [NSLocalizedDescriptionKey: message])
  }
}

/// Objective-C helper for retrieving `NSError` instances corresponding to `CheckoutError` cases.
@objc(CheckoutErrorBridge)
public final class CheckoutErrorBridge: NSObject {
  @objc(errorFor:)
  public static func error(for code: CheckoutError) -> NSError {
    return code.nsError
  }
}
