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

import Foundation

public struct ProjectResponse: Codable, Equatable {
    public var applicantCount: Int?
    public var canUploadSubmissions: Bool
    public var completedAt: Date?
    public var createdAt: Date
    public var creatorAvatarUrl: String?
    public var creatorAverageRating: Double?
    public var creatorDisplayName: String?
    public var creatorHandle: String?
    public var creatorId: String
    public var creatorReviewCount: Int?
    public var creditBounty: Int
    public var creditsHeldInEscrow: Int
    public var deadline: Date?
    public var description: String
    public var fulfillerAvatarUrl: String?
    public var fulfillerDisplayName: String?
    public var fulfillerHandle: String?
    public var fulfillerId: String?
    public var id: Id
    public var isCreator: Bool
    public var isFulfiller: Bool
    public var originalClipId: String?
    public var originalClipImageUrl: String?
    public var publishedAt: Date?
    public var status: String
    public var summary: String?
    public var title: String
    public var updatedAt: Date

    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(applicantCount: Int? = nil, canUploadSubmissions: Bool? = nil, completedAt: Date? = nil, createdAt: Date, creatorAvatarUrl: String? = nil, creatorAverageRating: Double? = nil, creatorDisplayName: String? = nil, creatorHandle: String? = nil, creatorId: String, creatorReviewCount: Int? = nil, creditBounty: Int, creditsHeldInEscrow: Int, deadline: Date? = nil, description: String, fulfillerAvatarUrl: String? = nil, fulfillerDisplayName: String? = nil, fulfillerHandle: String? = nil, fulfillerId: String? = nil, id: Id, isCreator: Bool? = nil, isFulfiller: Bool? = nil, originalClipId: String? = nil, originalClipImageUrl: String? = nil, publishedAt: Date? = nil, status: String, summary: String? = nil, title: String, updatedAt: Date) {
        self.applicantCount = applicantCount
        self.canUploadSubmissions = canUploadSubmissions ?? false
        self.completedAt = completedAt
        self.createdAt = createdAt
        self.creatorAvatarUrl = creatorAvatarUrl
        self.creatorAverageRating = creatorAverageRating
        self.creatorDisplayName = creatorDisplayName
        self.creatorHandle = creatorHandle
        self.creatorId = creatorId
        self.creatorReviewCount = creatorReviewCount
        self.creditBounty = creditBounty
        self.creditsHeldInEscrow = creditsHeldInEscrow
        self.deadline = deadline
        self.description = description
        self.fulfillerAvatarUrl = fulfillerAvatarUrl
        self.fulfillerDisplayName = fulfillerDisplayName
        self.fulfillerHandle = fulfillerHandle
        self.fulfillerId = fulfillerId
        self.id = id
        self.isCreator = isCreator ?? false
        self.isFulfiller = isFulfiller ?? false
        self.originalClipId = originalClipId
        self.originalClipImageUrl = originalClipImageUrl
        self.publishedAt = publishedAt
        self.status = status
        self.summary = summary
        self.title = title
        self.updatedAt = updatedAt
    }
}
