ContactMerge.kt 55 lignes · 2047 octets
package fr.ebii.card2vcf.crm

import fr.ebii.card2vcf.data.CrmContactEntity

data class MergeFieldChoices(
    val fullNameFromId: Long,
    val firstNameFromId: Long,
    val lastNameFromId: Long,
    val companyFromId: Long,
    val jobTitleFromId: Long,
    val websiteFromId: Long,
    val addressFromId: Long,
    val notesMode: NotesMode,
    val cardImageFromId: Long?,
    val profileImageFromId: Long?,
    val keepId: Long,
)

enum class NotesMode { KEEP_PRIMARY, CONCAT }

object ContactMerge {
    fun merge(
        sources: Map<Long, CrmContactEntity>,
        choices: MergeFieldChoices,
        now: Long = System.currentTimeMillis(),
    ): CrmContactEntity {
        fun scalar(picker: Long, sel: (CrmContactEntity) -> String?) =
            sources.getValue(picker).let(sel)
        val keep = sources.getValue(choices.keepId)
        val phones = sources.values.flatMap { it.phones }.distinct()
        val emails = sources.values.flatMap { it.emails }.distinct()
        val notes = when (choices.notesMode) {
            NotesMode.KEEP_PRIMARY -> keep.notes
            NotesMode.CONCAT -> sources.values.mapNotNull { it.notes?.takeIf { n -> n.isNotBlank() } }
                .distinct()
                .joinToString("\n---\n")
                .ifBlank { null }
        }
        return keep.copy(
            fullName = scalar(choices.fullNameFromId) { it.fullName },
            firstName = scalar(choices.firstNameFromId) { it.firstName },
            lastName = scalar(choices.lastNameFromId) { it.lastName },
            company = scalar(choices.companyFromId) { it.company },
            jobTitle = scalar(choices.jobTitleFromId) { it.jobTitle },
            website = scalar(choices.websiteFromId) { it.website },
            address = scalar(choices.addressFromId) { it.address },
            notes = notes,
            phones = phones,
            emails = emails,
            phonesText = phones.joinToString(" "),
            emailsText = emails.joinToString(" "),
            updatedAt = now,
        )
    }
}