import Contact from './Contact.js'

class Conversation {
    constructor(id, accountId, members) {
        this.id = id
        this.accountId = accountId
        this.members = members || []
        this.messages = []
    }

    static from(accountId, object) {
        return new Conversation(object.id, accountId, object.members.map(member => {
            member.contact = Contact.from(member.contact)
            return member
        }))
    }
    static fromSingleContact(accountId, contact) {
        return new Conversation(undefined, accountId, [{contact}])
    }

    getId() { return this.id }

    getAccountId() { return this.accountId }

    getDisplayName() {
        if (this.members.length !== 0) {
            return this.members[0].contact.getDisplayName()
        }
        return this.getDisplayUri()
    }

    getDisplayNameNoFallback() {
        if (this.members.length !== 0) {
            return this.members[0].contact.getDisplayNameNoFallback()
        }
    }

    async getObject(params) {
        const members = params.memberFilter ? this.members.filter(params.memberFilter) : this.members
        return {
            id: this.id,
            members: await Promise.all(members.map(async member => {
                const copiedMember = { role: member.role }//Object.assign({}, member);
                copiedMember.contact = await member.contact.getObject()
                return copiedMember
            }))
        }
    }

    getSummary() {
        return this.getObject()
    }

    getDisplayUri() {
        return this.getId() || this.getFirstMember().contact.getUri()
    }

    getFirstMember() {
        return this.members[0]
    }

    getMembers() {
        return this.members
    }

    addMessage(message) {
        this.messages.push(message)
    }
}

export default Conversation;
