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

import Foundation
import Get
import URLQueryEncoder

extension Paths.Persona {
    public var getLovedPersonas: GetLovedPersonas {
        GetLovedPersonas(path: path + "/get-loved-personas")
    }

    public struct GetLovedPersonas {
        /// Path: `/api/persona/get-loved-personas`
        public let path: String

        /// Get Loved Personas
        public func get(parameters: GetParameters? = nil) -> Request<GenAPI.PersonasResponseSchema> {
            Request(path: path, method: "GET", query: parameters?.asQuery, id: "studio_api_bots_persona_api_get_loved_personas")
        }

        public struct GetParameters {
            public var page: Int?
            public var query: String?
            public var categories: [String]?
            public var ids: String?
            public var status: String?
            public var isLiked: Bool?
            public var hideDisliked: Bool?
            public var isPublic: Bool?
            public var isNotDisliked: Bool?
            public var isFullSong: Bool?
            public var isVideoToSong: Bool?
            public var isSunoShort: Bool?
            public var addPresetClips: Bool?
            public var hideGenStems: Bool?
            public var isGenStem: Bool?
            public var hideStudioClips: Bool?
            public var isTrashed: Bool?
            /// Sort field for playlist clips
            public var sortBy: SortBy?
            /// Sort order for playlist clips
            public var sortOrder: SortOrder?
            public var fromIndex: Int?
            public var pageSize: Int?
            public var continuationToken: String?
            public var isCover: Bool?
            public var isExtend: Bool?
            public var isInfill: Bool?
            public var isPersona: Bool?
            public var isScene: Bool?
            public var isUpsample: Bool?

            /// Sort field for playlist clips
            public struct SortBy: RawRepresentable, Codable, Equatable {
                public let rawValue: String

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

                public static let createdAt = Self(rawValue: "created_at")
                public static let title = Self(rawValue: "title")
                public static let playCount = Self(rawValue: "play_count")
                public static let upvoteCount = Self(rawValue: "upvote_count")
            }

            /// Sort order for playlist clips
            public struct SortOrder: RawRepresentable, Codable, Equatable {
                public let rawValue: String

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

                public static let asc = Self(rawValue: "asc")
                public static let desc = Self(rawValue: "desc")
            }

            public init(page: Int? = nil, query: String? = nil, categories: [String]? = nil, ids: String? = nil, status: String? = nil, isLiked: Bool? = nil, hideDisliked: Bool? = nil, isPublic: Bool? = nil, isNotDisliked: Bool? = nil, isFullSong: Bool? = nil, isVideoToSong: Bool? = nil, isSunoShort: Bool? = nil, addPresetClips: Bool? = nil, hideGenStems: Bool? = nil, isGenStem: Bool? = nil, hideStudioClips: Bool? = nil, isTrashed: Bool? = nil, sortBy: SortBy? = nil, sortOrder: SortOrder? = nil, fromIndex: Int? = nil, pageSize: Int? = nil, continuationToken: String? = nil, isCover: Bool? = nil, isExtend: Bool? = nil, isInfill: Bool? = nil, isPersona: Bool? = nil, isScene: Bool? = nil, isUpsample: Bool? = nil) {
                self.page = page
                self.query = query
                self.categories = categories
                self.ids = ids
                self.status = status
                self.isLiked = isLiked
                self.hideDisliked = hideDisliked
                self.isPublic = isPublic
                self.isNotDisliked = isNotDisliked
                self.isFullSong = isFullSong
                self.isVideoToSong = isVideoToSong
                self.isSunoShort = isSunoShort
                self.addPresetClips = addPresetClips
                self.hideGenStems = hideGenStems
                self.isGenStem = isGenStem
                self.hideStudioClips = hideStudioClips
                self.isTrashed = isTrashed
                self.sortBy = sortBy
                self.sortOrder = sortOrder
                self.fromIndex = fromIndex
                self.pageSize = pageSize
                self.continuationToken = continuationToken
                self.isCover = isCover
                self.isExtend = isExtend
                self.isInfill = isInfill
                self.isPersona = isPersona
                self.isScene = isScene
                self.isUpsample = isUpsample
            }

            public var asQuery: [(String, String?)] {
                let encoder = URLQueryEncoder()
                encoder.encode(page, forKey: "page")
                encoder.encode(query, forKey: "query")
                encoder.encode(categories, forKey: "categories")
                encoder.encode(ids, forKey: "ids")
                encoder.encode(status, forKey: "status")
                encoder.encode(isLiked, forKey: "is_liked")
                encoder.encode(hideDisliked, forKey: "hide_disliked")
                encoder.encode(isPublic, forKey: "is_public")
                encoder.encode(isNotDisliked, forKey: "is_not_disliked")
                encoder.encode(isFullSong, forKey: "is_full_song")
                encoder.encode(isVideoToSong, forKey: "is_video_to_song")
                encoder.encode(isSunoShort, forKey: "is_suno_short")
                encoder.encode(addPresetClips, forKey: "add_preset_clips")
                encoder.encode(hideGenStems, forKey: "hide_gen_stems")
                encoder.encode(isGenStem, forKey: "is_gen_stem")
                encoder.encode(hideStudioClips, forKey: "hide_studio_clips")
                encoder.encode(isTrashed, forKey: "is_trashed")
                encoder.encode(sortBy, forKey: "sort_by")
                encoder.encode(sortOrder, forKey: "sort_order")
                encoder.encode(fromIndex, forKey: "from_index")
                encoder.encode(pageSize, forKey: "page_size")
                encoder.encode(continuationToken, forKey: "continuation_token")
                encoder.encode(isCover, forKey: "is_cover")
                encoder.encode(isExtend, forKey: "is_extend")
                encoder.encode(isInfill, forKey: "is_infill")
                encoder.encode(isPersona, forKey: "is_persona")
                encoder.encode(isScene, forKey: "is_scene")
                encoder.encode(isUpsample, forKey: "is_upsample")
                return encoder.items
            }
        }
    }
}
