import { defineStore } from 'pinia'
import { toast } from '../utils/toast.js'
import { ref, computed } from 'vue'
import { useApi } from '../composables/useApi.js'

export const useGallerySelectionStore = defineStore('gallerySelection', () => {
  const api = useApi()

  const isSelectMode = ref(false)
  const order = ref([])            // image ids, selection order = source of truth
  const commonTags = ref([])
  const consensus = ref({})        // { category: [ {canonical_tag_id,...} ] }

  const count = computed(() => order.value.length)
  function isSelected(id) { return order.value.includes(id) }

  function toggle(id) {
    const i = order.value.indexOf(id)
    if (i === -1) order.value.push(id)
    else order.value.splice(i, 1)
  }
  function clear() {
    order.value = []
    commonTags.value = []
    consensus.value = {}
  }
  function enterSelectMode() { isSelectMode.value = true }
  function exitSelectMode() { isSelectMode.value = false; clear() }

  async function loadCommonTags() {
    if (order.value.length === 0) { commonTags.value = []; return }
    const body = await api.post('/api/images/common-tags', {
      body: { image_ids: order.value }
    })
    commonTags.value = body.tags
  }

  async function loadConsensus() {
    if (order.value.length === 0) { consensus.value = {}; return }
    const body = await api.post('/api/suggestions/bulk', {
      body: { image_ids: order.value }
    })
    consensus.value = body.suggestions
  }

  async function refresh() {
    await Promise.all([loadCommonTags(), loadConsensus()])
  }

  async function bulkAdd(tagId, source = 'manual') {
    const body = await api.post('/api/images/bulk/tags', {
      body: { image_ids: order.value, tag_id: tagId, source }
    })
    await refresh()
    toast({
      text: `Added to ${body.added_count} image(s)`, type: 'success'
    })
    return body
  }

  async function bulkRemove(tagId) {
    const body = await api.post('/api/images/bulk/tags/remove', {
      body: { image_ids: order.value, tag_id: tagId }
    })
    await refresh()
    toast({
      text: `Removed from ${body.removed_count} image(s)`, type: 'success'
    })
    return body
  }

  return {
    isSelectMode, order, commonTags, consensus, count,
    isSelected, toggle, clear, enterSelectMode, exitSelectMode,
    loadCommonTags, loadConsensus, refresh, bulkAdd, bulkRemove
  }
})
