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

import Foundation

public struct MessageResponse: Codable, Equatable {
    public var content: String
    public var createdAt: Date
    public var id: Id
    public var mediaReferences: [MediaResponse]
    public var parentMessageId: ParentMessageId?
    public var projectId: ProjectId
    public var senderAvatarUrl: String?
    public var senderDisplayName: String?
    public var senderHandle: String?
    public var senderId: Int
    public var senderRole: String
    public var timeRange: [String: AnyJSON]?

    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 ParentMessageId: 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 ProjectId: 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(content: String, createdAt: Date, id: Id, mediaReferences: [MediaResponse], parentMessageId: ParentMessageId? = nil, projectId: ProjectId, senderAvatarUrl: String? = nil, senderDisplayName: String? = nil, senderHandle: String? = nil, senderId: Int, senderRole: String, timeRange: [String: AnyJSON]? = nil) {
        self.content = content
        self.createdAt = createdAt
        self.id = id
        self.mediaReferences = mediaReferences
        self.parentMessageId = parentMessageId
        self.projectId = projectId
        self.senderAvatarUrl = senderAvatarUrl
        self.senderDisplayName = senderDisplayName
        self.senderHandle = senderHandle
        self.senderId = senderId
        self.senderRole = senderRole
        self.timeRange = timeRange
    }
}
