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

import Foundation

public struct ProjectInviteSchema: Codable, Equatable {
    public var createdAt: Date
    public var id: Id
    public var invitedByUserAvatarUrl: String?
    public var invitedByUserDisplayName: String?
    public var invitedByUserHandle: String?
    public var invitedByUserId: UUID
    public var invitedUserAvatarUrl: String?
    public var invitedUserDisplayName: String?
    public var invitedUserHandle: String?
    public var invitedUserId: UUID
    /// ProjectMetadataSchema
    public var project: ProjectMetadataSchema
    public var status: Status
    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 struct Status: RawRepresentable, Codable, Equatable {
        public let rawValue: String

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

        public static let accepted = Self(rawValue: "accepted")
        public static let pending = Self(rawValue: "pending")
        public static let cancelled = Self(rawValue: "cancelled")
    }

    public init(createdAt: Date, id: Id, invitedByUserAvatarUrl: String? = nil, invitedByUserDisplayName: String? = nil, invitedByUserHandle: String? = nil, invitedByUserId: UUID, invitedUserAvatarUrl: String? = nil, invitedUserDisplayName: String? = nil, invitedUserHandle: String? = nil, invitedUserId: UUID, project: ProjectMetadataSchema, status: Status, updatedAt: Date) {
        self.createdAt = createdAt
        self.id = id
        self.invitedByUserAvatarUrl = invitedByUserAvatarUrl
        self.invitedByUserDisplayName = invitedByUserDisplayName
        self.invitedByUserHandle = invitedByUserHandle
        self.invitedByUserId = invitedByUserId
        self.invitedUserAvatarUrl = invitedUserAvatarUrl
        self.invitedUserDisplayName = invitedUserDisplayName
        self.invitedUserHandle = invitedUserHandle
        self.invitedUserId = invitedUserId
        self.project = project
        self.status = status
        self.updatedAt = updatedAt
    }
}
