// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

import { _converse, converse } from '../../../src/headless/index.js'
import { XMLNS_NOTE } from './constants.js'
import { ChatRoomNote } from './note.js'
import { ChatRoomNotes } from './notes.js'
import {
  initOrDestroyChatRoomNotes, getHeadingButtons, getMessageActionButtons, getOccupantActionButtons
} from './utils.js'
import notesApi from './api.js'

import './components/muc-note-app-view.js'
import './components/muc-notes-view.js'
import './components/muc-note-view.js'
import './components/muc-note-occupant-view.js'

converse.plugins.add('livechat-converse-notes', {
  dependencies: ['converse-muc', 'converse-disco', 'converse-pubsub'],

  initialize () {
    Object.assign(
      _converse.exports,
      {
        ChatRoomNotes,
        ChatRoomNote
      }
    )

    _converse.api.settings.extend({
      livechat_note_app_enabled: false,
      livechat_note_app_restore: false // should we open the app by default if it was previously oppened?
    })

    Object.assign(_converse.api, {
      livechat_notes: notesApi
    })

    _converse.api.listen.on('chatRoomInitialized', muc => {
      muc.session.on('change:connection_status', _session => {
        // When joining a room, initializing the Notes object (if user has access),
        // When disconnected from a room, destroying the Notes object:
        initOrDestroyChatRoomNotes(muc)
      })

      // When the current user affiliation changes, we must also delete or initialize the TaskLists object:
      muc.occupants.on('change:affiliation', occupant => {
        if (occupant.get('jid') !== _converse.bare_jid) { // only for myself
          return
        }
        initOrDestroyChatRoomNotes(muc)
      })

      // To be sure that everything works in any case, we also must listen for addition in muc.features.
      muc.features.on('change:' + XMLNS_NOTE, () => {
        initOrDestroyChatRoomNotes(muc)
      })
    })

    // adding the "Notes" button in the MUC heading buttons:
    _converse.api.listen.on('getHeadingButtons', getHeadingButtons)

    // Adding buttons on messages:
    _converse.api.listen.on('getMessageActionButtons', getMessageActionButtons)
    // Adding buttons on occupants:
    _converse.api.listen.on('getOccupantActionButtons', getOccupantActionButtons)
  }
})