import Foundation @MainActor protocol LeadDetailRepository { func detail(id: String, salesCode: String) async throws -> LeadDetail func file(_ reference: LeadFileReference, leadID: String, salesCode: String) async throws -> URL } struct GetLeadDetailUseCase { let repository: any LeadDetailRepository func execute(id: String, salesCode: String) async throws -> LeadDetail { try await repository.detail(id: id, salesCode: salesCode) } } struct DownloadLeadDocumentUseCase { let repository: any LeadDetailRepository func execute(_ document: LeadDocument, leadID: String, salesCode: String) async throws -> URL { guard document.file.kind == .pdf else { throw LeadFileError.invalidFile } return try await repository.file(document.file, leadID: leadID, salesCode: salesCode) } } struct LoadLeadPhotoUseCase { let repository: any LeadDetailRepository func execute(_ photo: LeadPhoto, original: Bool = false, leadID: String, salesCode: String) async throws -> URL { try await repository.file(original ? photo.original : photo.thumbnail, leadID: leadID, salesCode: salesCode) } }