// Generated from developer.reits.tech/contract-registry/v1. DO NOT EDIT.
import Foundation

public enum JSONValue: Codable, Sendable {
    case string(String), number(Double), bool(Bool), object([String: JSONValue]), array([JSONValue]), null

    public init(from decoder: Decoder) throws {
        let value = try decoder.singleValueContainer()
        if value.decodeNil() { self = .null }
        else if let decoded = try? value.decode(Bool.self) { self = .bool(decoded) }
        else if let decoded = try? value.decode(Double.self) { self = .number(decoded) }
        else if let decoded = try? value.decode(String.self) { self = .string(decoded) }
        else if let decoded = try? value.decode([String: JSONValue].self) { self = .object(decoded) }
        else { self = .array(try value.decode([JSONValue].self)) }
    }

    public func encode(to encoder: Encoder) throws {
        var value = encoder.singleValueContainer()
        switch self {
        case .string(let decoded): try value.encode(decoded)
        case .number(let decoded): try value.encode(decoded)
        case .bool(let decoded): try value.encode(decoded)
        case .object(let decoded): try value.encode(decoded)
        case .array(let decoded): try value.encode(decoded)
        case .null: try value.encodeNil()
        }
    }
}

public struct ErrorEnvelope: Codable, Sendable {
    public let code: String
    public let message: String
    public let traceId: String
    public let retryable: Bool
    public let details: [String: JSONValue]?
}

public enum AppType: String, Codable, Sendable {
    case ordinary = "ordinary"
    case enterprise = "enterprise"
}

public enum AppKind: String, Codable, Sendable {
    case miniapp = "miniapp"
    case bot = "bot"
}

public enum ReleaseStatus: String, Codable, Sendable {
    case draft = "draft"
    case uploaded = "uploaded"
    case scanning = "scanning"
    case review = "review"
    case rejected = "rejected"
    case approved = "approved"
    case live = "live"
    case rolled_back = "rolled_back"
}

public enum BookingOrderStatus: String, Codable, Sendable {
    case held = "held"
    case confirmed = "confirmed"
    case cancel_requested = "cancel_requested"
    case cancelled = "cancelled"
    case completed = "completed"
    case expired = "expired"
    case refunded = "refunded"
}

public enum MarketSliceStatus: String, Codable, Sendable {
    case staging = "staging"
    case ready = "ready"
    case rejected = "rejected"
    case expired = "expired"
}

public enum QuantRunStatus: String, Codable, Sendable {
    case queued = "queued"
    case running = "running"
    case succeeded = "succeeded"
    case failed = "failed"
    case cancelled = "cancelled"
}

public struct AuthSession: Codable, Sendable {
    public let sessionId: String
    public let clientId: String
    public let subject: [String: JSONValue]
    public let scopes: [String]
    public let state: String
    public let issuedAt: String
    public let expiresAt: String
}

public struct DeveloperApp: Codable, Sendable {
    public let id: Int
    public let appKey: String
    public let name: String
    public let kind: AppKind
    public let appType: AppType
    public let status: String
    public let ownerId: String
    public let revision: Int
}

public struct ReleaseCandidate: Codable, Sendable {
    public let releaseId: String
    public let appId: Int
    public let versionCode: Int
    public let versionName: String
    public let artifact: [String: JSONValue]
    public let status: ReleaseStatus
    public let createdAt: String
}

public struct EventEnvelope: Codable, Sendable {
    public let eventId: String
    public let eventType: String
    public let eventVersion: Int
    public let occurredAt: String
    public let producer: String
    public let tenantId: String
    public let actor: [String: String]?
    public let resource: [String: String]
    public let idempotencyKey: String
    public let traceId: String
    public let data: [String: JSONValue]
}

public struct MediaAsset: Codable, Sendable {
    public let assetId: String
    public let objectKey: String
    public let contentType: String
    public let size: Int
    public let sha256: String
    public let status: String
    public let storageBackend: String
    public let createdAt: String
}

public struct BookingOrder: Codable, Sendable {
    public let orderId: String
    public let consumerId: String
    public let merchantId: String
    public let serviceId: String
    public let slotId: String
    public let quantity: Int
    public let amount: [String: JSONValue]
    public let status: BookingOrderStatus
    public let revision: Int
    public let idempotencyKey: String
}

public struct MarketSlice: Codable, Sendable {
    public let sliceId: String
    public let symbol: String
    public let venue: String
    public let interval: String
    public let startAt: String
    public let endAt: String
    public let dataAsOf: String
    public let recordCount: Int
    public let storageUri: String
    public let checksum: String
    public let licenseClass: String
    public let status: MarketSliceStatus
}

public struct QuantRun: Codable, Sendable {
    public let runId: String
    public let strategyVersionId: String
    public let marketSliceIds: [String]
    public let status: QuantRunStatus
    public let inputHash: String
    public let engineHash: String
    public let resultHash: String?
    public let createdAt: String
    public let startedAt: String?
    public let completedAt: String?
    public let error: ErrorEnvelope?
}

