import { defineStore } from 'pinia'
import type { ChatMessage } from '~/types'

interface ChatUser {
  id: number
  name: string
  avatar?: string
  [key: string]: unknown
}

interface ChatState {
  messages: ChatMessage[]
  newMsgs: ChatMessage[]
  lastMsgs: ChatMessage[]
  users: ChatUser[]
  receiverId: number | null
  typingUser: boolean
  isOnline: boolean
  isSeen: boolean
  seenStatus: boolean
  unreadMessageCount: number
  firebaseConnected: boolean
}

export const useChatStore = defineStore('chat', {
  state: (): ChatState => ({
    messages: [],
    newMsgs: [],
    lastMsgs: [],
    users: [],
    receiverId: null,
    typingUser: false,
    isOnline: false,
    isSeen: false,
    seenStatus: false,
    unreadMessageCount: 0,
    firebaseConnected: false,
  }),

  getters: {
    getReceiverId: (state) => state.receiverId,
    isFirebaseConnected: (state) => state.firebaseConnected,
    getUnreadMessageCount: (state) => state.unreadMessageCount,
  },

  actions: {
    addMessage(msg: ChatMessage) {
      if (msg.file) {
        msg.url = URL.createObjectURL(msg.file)
      }
      this.messages = [...this.messages, msg]
    },

    addReceivedMessage(msg: ChatMessage) {
      if (msg.sender_id == this.receiverId) {
        const exists = this.messages.some(
          (m) => m.message_id && m.message_id === msg.message_id,
        )
        if (!exists) {
          this.messages = [...this.messages, msg]
        }
      }
    },

    setUnreadMessages(count: number) {
      this.unreadMessageCount = count
    },

    resetUnreadMessages() {
      this.unreadMessageCount = 0
    },

    setTypingIndicator(typing: boolean) {
      this.typingUser = typing
    },

    updateSeenStatusAll() {
      this.messages = this.messages.map((msg) => {
        if (msg.seen_status === false) {
          return { ...msg, seen_status: true }
        }
        return msg
      })
    },

    setIsOnline(isOnline: boolean) {
      this.isOnline = isOnline
    },

    setIsSeen(seen: boolean) {
      this.isSeen = seen
    },

    setReceiver(receiverId: number) {
      this.receiverId = receiverId
    },

    setMessages(msgs: ChatMessage[]) {
      this.messages = msgs
    },

    setUsers(users: ChatUser[]) {
      this.users = users
    },

    clearChat() {
      this.messages = []
      this.newMsgs = []
      this.lastMsgs = []
      this.users = []
      this.receiverId = null
    },

    setSeenStatus(status: boolean) {
      this.seenStatus = status
    },

    setFirebaseConnected(connected: boolean) {
      this.firebaseConnected = connected
    },
  },
})
