//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

#if TESTABLE_BUILD

public import CoreGraphics
import Foundation

extension AttachmentReference.ConstructionParams {

    public static func mock(
        owner: AttachmentReference.Owner,
        sourceFilename: String? = UUID().uuidString,
        sourceUnencryptedByteCount: UInt32? = .random(in: 0...100),
        sourceMediaSizePixels: CGSize? = CGSize(width: .random(in: 0...100), height: .random(in: 0...100)),
    ) -> AttachmentReference.ConstructionParams {
        return AttachmentReference.ConstructionParams(
            owner: owner,
            sourceFilename: sourceFilename,
            sourceUnencryptedByteCount: sourceUnencryptedByteCount,
            sourceMediaSizePixels: sourceMediaSizePixels,
        )
    }

    public static func mockMessageBodyAttachmentReference(
        attachmentRecord: Attachment.Record,
        messageRowId: Int64,
        threadRowId: Int64,
        receivedAtTimestamp: UInt64 = Date().ows_millisecondsSince1970,
        caption: String? = nil,
        renderingFlag: AttachmentReference.RenderingFlag = .default,
        isViewOnce: Bool = false,
        isPastEditRevision: Bool = false,
        orderInMessage: UInt32 = 0,
        idInOwner: UUID? = nil,
        sourceFilename: String? = UUID().uuidString,
        sourceUnencryptedByteCount: UInt32? = .random(in: 0...100),
        sourceMediaSizePixels: CGSize? = CGSize(width: .random(in: 0...100), height: .random(in: 0...100)),
    ) -> AttachmentReference.ConstructionParams {
        return .mock(
            owner: .message(.bodyAttachment(.init(
                messageRowId: messageRowId,
                receivedAtTimestamp: receivedAtTimestamp,
                threadRowId: threadRowId,
                contentType: attachmentRecord.contentType,
                isPastEditRevision: isPastEditRevision,
                caption: caption,
                renderingFlag: renderingFlag,
                orderInMessage: orderInMessage,
                idInOwner: idInOwner,
                isViewOnce: isViewOnce,
            ))),
            sourceFilename: sourceFilename,
            sourceUnencryptedByteCount: sourceUnencryptedByteCount,
            sourceMediaSizePixels: sourceMediaSizePixels,
        )
    }

    public static func mockMessageStickerReference(
        messageRowId: Int64,
        threadRowId: Int64,
        receivedAtTimestamp: UInt64 = Date().ows_millisecondsSince1970,
        contentType: Attachment.ContentType = .image,
        isPastEditRevision: Bool = false,
        stickerPackId: Data = Data(repeating: 0, count: 16),
        stickerId: UInt32 = 0,
        sourceFilename: String? = UUID().uuidString,
        sourceUnencryptedByteCount: UInt32? = .random(in: 0...100),
        sourceMediaSizePixels: CGSize? = CGSize(width: .random(in: 0...100), height: .random(in: 0...100)),
    ) -> AttachmentReference.ConstructionParams {
        return .mock(
            owner: .message(.sticker(.init(
                messageRowId: messageRowId,
                receivedAtTimestamp: receivedAtTimestamp,
                threadRowId: threadRowId,
                contentType: contentType,
                isPastEditRevision: isPastEditRevision,
                stickerPackId: stickerPackId,
                stickerId: stickerId,
            ))),
            sourceFilename: sourceFilename,
            sourceUnencryptedByteCount: sourceUnencryptedByteCount,
            sourceMediaSizePixels: sourceMediaSizePixels,
        )
    }
}

#endif
