// Generated by Create API
// https://github.com/CreateAPI/CreateAPI

import Foundation

public struct GeneratedClipSchema: Codable, Equatable, Identifiable {
    public var allowComments: Bool?
    public var allowedRemixActions: [RemixAction]?
    /// AudioMetadataSchema
    public var audioMetadata: AudioMetadataSchema?
    public var audioUrl: String?
    public var avatarImageUrl: String?
    public var batchIndex: Int?
    public var caption: String?
    /// MentionsContainer
    public var captionMentions: MentionsContainer?
    public var commentCount: Int?
    public var createdAt: Date
    public var displayName: String?
    public var displayTags: String?
    public var downloadDisabledReason: DownloadDisabledReason?
    public var entityType: EntityType?
    public var explicit: Bool?
    public var flagCount: Int?
    public var handle: String?
    public var hasHook: Bool
    public var hookPreviewThumbnailUrl: String?
    public var id: UUID
    public var imageLargeUrl: String?
    public var imageUrl: String?
    public var isContestBaseClip: Bool?
    public var isContestClip: Bool?
    public var isFollowingCreator: Bool?
    public var isHandleUpdated: Bool
    public var isLiked: Bool
    public var isPinned: Bool?
    public var isPublic: Bool?
    public var isTrashed: Bool
    public var majorModelVersion: String
    /// GenMetadataSchema
    ///
    /// Selected fields from GeneratedClip.metadata.
    public var metadata: GenMetadataSchema
    public var modelName: String
    /// ClipOwnershipSchema
    public var ownership: ClipOwnershipSchema?
    /// SimplePersonaSchema
    public var persona: SimplePersonaSchema?
    public var playCount: Int?
    public var previewSeconds: Int?
    public var previewUrl: String?
    /// SimpleProjectSchema
    public var project: SimpleProjectSchema?
    /// UserReactionSchema
    public var reaction: UserReactionSchema?
    /// ClipRemixPermissionDefaults
    public var remixDefaults: ClipRemixPermissionDefaults?
    public var remixRestrictionReason: String?
    public var status: String?
    public var title: String?
    public var upvoteCount: Int?
    public var userId: String?
    public var videoCoverStreamingUrls: [String: String]?
    public var videoCoverUrl: String?
    public var videoUrl: String?

    public struct DownloadDisabledReason: RawRepresentable, Codable, Equatable {
        public let rawValue: String

        public init(rawValue: String) {
            self.rawValue = rawValue
        }

        public static let remixContest = Self(rawValue: "remix_contest")
    }

    public struct EntityType: RawRepresentable, Codable, Equatable {
        public let rawValue: String

        public init(rawValue: String) {
            self.rawValue = rawValue
        }

        public static let songSchema = Self(rawValue: "song_schema")
    }

    public init(allowComments: Bool? = nil, allowedRemixActions: [RemixAction]? = nil, audioMetadata: AudioMetadataSchema? = nil, audioUrl: String? = nil, avatarImageUrl: String? = nil, batchIndex: Int? = nil, caption: String? = nil, captionMentions: MentionsContainer? = nil, commentCount: Int? = nil, createdAt: Date, displayName: String? = nil, displayTags: String? = nil, downloadDisabledReason: DownloadDisabledReason? = nil, entityType: EntityType? = nil, explicit: Bool? = nil, flagCount: Int? = nil, handle: String? = nil, hasHook: Bool? = nil, hookPreviewThumbnailUrl: String? = nil, id: UUID, imageLargeUrl: String? = nil, imageUrl: String? = nil, isContestBaseClip: Bool? = nil, isContestClip: Bool? = nil, isFollowingCreator: Bool? = nil, isHandleUpdated: Bool, isLiked: Bool, isPinned: Bool? = nil, isPublic: Bool? = nil, isTrashed: Bool, majorModelVersion: String, metadata: GenMetadataSchema, modelName: String, ownership: ClipOwnershipSchema? = nil, persona: SimplePersonaSchema? = nil, playCount: Int? = nil, previewSeconds: Int? = nil, previewUrl: String? = nil, project: SimpleProjectSchema? = nil, reaction: UserReactionSchema? = nil, remixDefaults: ClipRemixPermissionDefaults? = nil, remixRestrictionReason: String? = nil, status: String? = nil, title: String? = nil, upvoteCount: Int? = nil, userId: String? = nil, videoCoverStreamingUrls: [String: String]? = nil, videoCoverUrl: String? = nil, videoUrl: String? = nil) {
        self.allowComments = allowComments
        self.allowedRemixActions = allowedRemixActions
        self.audioMetadata = audioMetadata
        self.audioUrl = audioUrl
        self.avatarImageUrl = avatarImageUrl
        self.batchIndex = batchIndex
        self.caption = caption
        self.captionMentions = captionMentions
        self.commentCount = commentCount
        self.createdAt = createdAt
        self.displayName = displayName
        self.displayTags = displayTags
        self.downloadDisabledReason = downloadDisabledReason
        self.entityType = entityType
        self.explicit = explicit
        self.flagCount = flagCount
        self.handle = handle
        self.hasHook = hasHook ?? false
        self.hookPreviewThumbnailUrl = hookPreviewThumbnailUrl
        self.id = id
        self.imageLargeUrl = imageLargeUrl
        self.imageUrl = imageUrl
        self.isContestBaseClip = isContestBaseClip
        self.isContestClip = isContestClip
        self.isFollowingCreator = isFollowingCreator
        self.isHandleUpdated = isHandleUpdated
        self.isLiked = isLiked
        self.isPinned = isPinned
        self.isPublic = isPublic
        self.isTrashed = isTrashed
        self.majorModelVersion = majorModelVersion
        self.metadata = metadata
        self.modelName = modelName
        self.ownership = ownership
        self.persona = persona
        self.playCount = playCount
        self.previewSeconds = previewSeconds
        self.previewUrl = previewUrl
        self.project = project
        self.reaction = reaction
        self.remixDefaults = remixDefaults
        self.remixRestrictionReason = remixRestrictionReason
        self.status = status
        self.title = title
        self.upvoteCount = upvoteCount
        self.userId = userId
        self.videoCoverStreamingUrls = videoCoverStreamingUrls
        self.videoCoverUrl = videoCoverUrl
        self.videoUrl = videoUrl
    }
}
