package model

import (
	"strings"
	"time"

	"github.com/rs/zerolog"
)

type Conversation struct {
	Date               Date     `json:"date"`
	Participants       []string `json:"participantDisplayNames"`
	DisplayName        *string  `json:"displayName,omitempty"` // Optional
	UnreadCount        int      `json:"unreadCount"`
	LastMessagePreview string   `json:"lastMessagePreview"`
	LastMessage        Message  `json:"lastMessage"`
	Guid               string   `json:"guid"`
}

func (c *Conversation) GetDisplayName() string {
	if c.DisplayName == nil {
		return strings.Join(c.Participants, ",")
	}

	return *c.DisplayName
}

func (c *Conversation) MarshalZerologObject(e *zerolog.Event) {
	e.Str("guid", c.Guid)
	e.Time("date", time.Time(c.Date))
	e.Int("unreadCount", c.UnreadCount)
	e.Str("lastMessagePreview", c.LastMessagePreview)
	e.Strs("participants", c.Participants)
	if c.DisplayName != nil {
		e.Str("displayName", *c.DisplayName)
	}
}

func (c *Conversation) Equal(o *Conversation) bool {
	if c.Guid != o.Guid {
		return false
	}

	if !c.Date.Equal(o.Date) {
		return false
	}

	if c.UnreadCount != o.UnreadCount {
		return false
	}

	if c.LastMessagePreview != o.LastMessagePreview {
		return false
	}

	if len(c.Participants) != len(o.Participants) {
		return false
	}

	for i, p := range c.Participants {
		if p != o.Participants[i] {
			return false
		}
	}

	if c.DisplayName != nil && o.DisplayName != nil {
		if *c.DisplayName != *o.DisplayName {
			return false
		}
	}

	return true
}
