import { ref } from 'vue'

const ministries = ref<{ id: number, ministry_name: string }[]>([])
const isLoadingMinistries = ref(true)
const ministriesError = ref<string | null>(null)
let hasFetchedMinistries = false
let isFetchMinistriesInProgress = false

const normalizeMinistries = (value: unknown): { id: number, ministry_name: string }[] | null => {
  if (!Array.isArray(value)) return null
  const seen = new Set<string>()
  const normalized: { id: number, ministry_name: string }[] = []
  for (const item of value) {
    if (!item || typeof item !== 'object') continue
    const record = item as { id?: unknown, ministry_name?: unknown }
    const name = typeof record.ministry_name === 'string' ? record.ministry_name.trim() : ''
    if (!name || seen.has(name) || typeof record.id !== 'number') continue
    seen.add(name)
    normalized.push({ id: record.id, ministry_name: name })
  }
  return normalized
}

export const useDashboardMinistries = () => {
  const fetchMinistries = async (force = false) => {
    if ((!force && hasFetchedMinistries) || isFetchMinistriesInProgress) return
    isFetchMinistriesInProgress = true
    isLoadingMinistries.value = true
    ministriesError.value = null
    try {
      const api = useApi()
      const data = await api.post('v3/dashboard/ministry', {})
      const normalized = normalizeMinistries(data?.data)
      if (!normalized) throw new Error('Ministry response invalid')
      ministries.value = normalized
      hasFetchedMinistries = true
    } catch (error) {
      ministries.value = []
      ministriesError.value = 'Ministry options unavailable'
      hasFetchedMinistries = false
    } finally {
      isFetchMinistriesInProgress = false
      isLoadingMinistries.value = false
    }
  }
  return { ministries, isLoadingMinistries, ministriesError, fetchMinistries }
}
