import Foundation

public struct PromoCodeStatus {
    public let promoCodeUrl: String?
    public let redemptionsLeft: Int?
    public let inviterHandle: String?
}

extension PromoCodeStatus {
    enum PromoCodeStatusInitError: LocalizedError {
        case unexpectedlyFoundNil(Components.Schemas.PromoCodeStatusResponse)

        var errorDescription: String? {
            switch self {
            case .unexpectedlyFoundNil(let schemaObject):
                "Unexpectedly found nil while unwrapping `PromoCodeStatusResponseSchema`, where all properties value should never be nil if `PromoCodeStatusResponseSchema.error_msg` is nil: \(schemaObject)"
            }
        }
    }

    init(_ remote: Components.Schemas.PromoCodeStatusResponse) throws {
        self.promoCodeUrl = remote.promo_code_url
        self.redemptionsLeft = remote.redemptions_left
        self.inviterHandle = remote.inviter_handle
    }
}

public struct UsePromoCodeResponse: Decodable {
    public let promoCode: String?
    public let promoCodeUrl: String?
    public let errorMsg: String?

    init(_ remote: Components.Schemas.UsePromoCodeResponse) {
        self.promoCode = remote.promo_code
        self.promoCodeUrl = remote.promo_code_url
        self.errorMsg = remote.error_msg
    }
}

public struct WaitlistResponse: Decodable {
    public let isWaitlisted: Bool

    init(_ remote: Components.Schemas.IosWaitlistResponse) {
        self.isWaitlisted = remote.is_waitlisted
    }
}
