import { ref } from 'vue'

const provinces = ref<{ id: number, provience_name: string }[]>([])
const isLoadingProvinces = ref(true)
const provincesError = ref<string | null>(null)
let hasFetchedProvinces = false
let isFetchProvincesInProgress = false

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

export const useDashboardProvinces = () => {
  const fetchProvinces = async (force = false) => {
    if ((!force && hasFetchedProvinces) || isFetchProvincesInProgress) return
    isFetchProvincesInProgress = true
    isLoadingProvinces.value = true
    provincesError.value = null
    try {
      const api = useApi()
      const data = await api.post('v3/dashboard/provience', {})
      const normalized = normalizeProvinces(data?.data)
      if (!normalized) throw new Error('Province response invalid')
      provinces.value = normalized
      hasFetchedProvinces = true
    } catch (error) {
      provinces.value = []
      provincesError.value = 'Province options unavailable'
      hasFetchedProvinces = false
    } finally {
      isFetchProvincesInProgress = false
      isLoadingProvinces.value = false
    }
  }
  return { provinces, isLoadingProvinces, provincesError, fetchProvinces }
}
