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

import Foundation

public struct PlaylistMetadataSchema: Codable, Equatable {
    public var currentPage: Int
    public var description: String?
    public var dislikeCount: Int?
    public var entityType: EntityType?
    public var flagCount: Int?
    public var id: Id
    public var imageUrl: String?
    public var isDiscoverPlaylist: Bool?
    public var isOwned: Bool
    public var isPublic: Bool
    public var isTrashed: Bool
    public var name: String?
    public var numTotalResults: Int
    public var playCount: Int?
    public var playlistClips: [PlaylistClipSchema]
    public var reaction: String?
    public var skipCount: Int?
    public var songCount: Int?
    public var upvoteCount: Int?
    public var userAvatarImageUrl: String?
    public var userDisplayName: String?
    public var userHandle: String?

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

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

        public static let playlistSchema = Self(rawValue: "playlist_schema")
    }

    public struct Id: Codable, Equatable {
        public var uuid: UUID?
        public var string: String?

        public init(uuid: UUID? = nil, string: String? = nil) {
            self.uuid = uuid
            self.string = string
        }

        public init(from decoder: Decoder) throws {
            let container = try decoder.singleValueContainer()
            self.uuid = try? container.decode(UUID.self)
            self.string = try? container.decode(String.self)
        }

        public func encode(to encoder: Encoder) throws {
            var container = encoder.singleValueContainer()
            if let value = uuid { try container.encode(value) }
            if let value = string { try container.encode(value) }
        }
    }

    public init(currentPage: Int, description: String? = nil, dislikeCount: Int? = nil, entityType: EntityType? = nil, flagCount: Int? = nil, id: Id, imageUrl: String? = nil, isDiscoverPlaylist: Bool? = nil, isOwned: Bool? = nil, isPublic: Bool, isTrashed: Bool, name: String? = nil, numTotalResults: Int, playCount: Int? = nil, playlistClips: [PlaylistClipSchema], reaction: String? = nil, skipCount: Int? = nil, songCount: Int? = nil, upvoteCount: Int? = nil, userAvatarImageUrl: String? = nil, userDisplayName: String? = nil, userHandle: String? = nil) {
        self.currentPage = currentPage
        self.description = description
        self.dislikeCount = dislikeCount
        self.entityType = entityType
        self.flagCount = flagCount
        self.id = id
        self.imageUrl = imageUrl
        self.isDiscoverPlaylist = isDiscoverPlaylist
        self.isOwned = isOwned ?? false
        self.isPublic = isPublic
        self.isTrashed = isTrashed
        self.name = name
        self.numTotalResults = numTotalResults
        self.playCount = playCount
        self.playlistClips = playlistClips
        self.reaction = reaction
        self.skipCount = skipCount
        self.songCount = songCount
        self.upvoteCount = upvoteCount
        self.userAvatarImageUrl = userAvatarImageUrl
        self.userDisplayName = userDisplayName
        self.userHandle = userHandle
    }
}
