<template>
  <CatalogPage
    :items="displayItems"
    :map-items="itemsWithCoords"
    :loading="isLoading || productsLoading"
    with-map
    map-id="offers-map"
    point-color="#f59e0b"
    :selected-id="selectedOfferId"
    :hovered-id="hoveredOfferId"
    :total-count="total"
    @select="onSelectOffer"
    @update:hovered-id="hoveredOfferId = $event"
  >
    <template #searchBar="{ displayedCount, totalCount }">
      <CatalogSearchBar
        v-model:search-query="searchQuery"
        :active-filters="activeFilterBadges"
        :displayed-count="displayedCount"
        :total-count="totalCount"
        @remove-filter="onRemoveFilter"
        @search="onSearch"
      >
        <template #filters>
          <div class="p-2 space-y-3">
            <div>
              <div class="text-xs font-semibold mb-1 text-base-content/70">{{ t('catalogOffersSection.filters.product') }}</div>
              <ul class="menu menu-compact max-h-48 overflow-y-auto">
                <li v-for="filter in productFilters" :key="filter.id">
                  <a
                    :class="{ 'active': (selectedProductUuid === filter.id || (!selectedProductUuid && filter.id === 'all')) }"
                    @click="onProductFilterChange(filter.id)"
                  >{{ filter.label }}</a>
                </li>
              </ul>
            </div>
          </div>
        </template>
      </CatalogSearchBar>
    </template>

    <template #card="{ item }">
      <OfferCard :offer="item" />
    </template>

    <template #pagination>
      <PaginationLoadMore
        v-if="displayItems.length > 0"
        :shown="displayItems.length"
        :total="total"
        :can-load-more="canLoadMore"
        :loading="isLoadingMore"
        hide-counter
        @load-more="loadMore"
        class="mt-4"
      />
    </template>

    <template #empty>
      <Text tone="muted">{{ t('catalogOffersSection.empty.no_offers') }}</Text>
    </template>
  </CatalogPage>
</template>

<script setup lang="ts">
import type { MapBounds } from '~/components/catalog/CatalogMap.vue'

definePageMeta({
  layout: 'topnav'
})

const { t } = useI18n()

// Products for filter
const {
  items: products,
  isLoading: productsLoading,
  init: initProducts
} = useCatalogProducts()

// Offers
const {
  items,
  total,
  selectedProductUuid,
  isLoading,
  isLoadingMore,
  canLoadMore,
  loadMore,
  init: initOffers,
  setProductUuid
} = useCatalogOffers()

// Selected/hovered offer for map highlighting
const selectedOfferId = ref<string>()
const hoveredOfferId = ref<string>()

// Search bar
const searchQuery = ref('')

// Search with map checkbox
const searchWithMap = ref(false)
const currentBounds = ref<MapBounds | null>(null)

// Map items with correct coordinate field names
const itemsWithCoords = computed(() =>
  items.value.filter(item =>
    item.locationLatitude != null &&
    item.locationLongitude != null &&
    !isNaN(Number(item.locationLatitude)) &&
    !isNaN(Number(item.locationLongitude))
  ).map(item => ({
    uuid: item.uuid,
    name: item.productName || '',
    latitude: Number(item.locationLatitude),
    longitude: Number(item.locationLongitude)
  }))
)

// Filtered items when searchWithMap is enabled
const displayItems = computed(() => {
  if (!searchWithMap.value || !currentBounds.value) return items.value
  return items.value.filter(item => {
    if (item.locationLatitude == null || item.locationLongitude == null) return false
    const { west, east, north, south } = currentBounds.value!
    const lng = Number(item.locationLongitude)
    const lat = Number(item.locationLatitude)
    return lng >= west && lng <= east && lat >= south && lat <= north
  })
})

// Product filter options
const productFilters = computed(() => {
  const all = [{ id: 'all', label: t('catalogOffersSection.filters.all_products') }]
  const productOptions = products.value.map(p => ({
    id: p.uuid,
    label: p.name
  }))
  return [...all, ...productOptions]
})

// Active filter badges
const activeFilterBadges = computed(() => {
  const badges: { id: string; label: string }[] = []
  if (selectedProductUuid.value) {
    const product = products.value.find(p => p.uuid === selectedProductUuid.value)
    if (product) badges.push({ id: `product:${product.uuid}`, label: product.name })
  }
  return badges
})

// Remove filter badge
const onRemoveFilter = (id: string) => {
  if (id.startsWith('product:')) {
    setProductUuid(null)
  }
}

// Handle product filter change
const onProductFilterChange = (value: string) => {
  setProductUuid(value === 'all' ? null : value)
}

// Search handler (for future use)
const onSearch = () => {
  // TODO: Implement search
}

const onSelectOffer = (offer: any) => {
  selectedOfferId.value = offer.uuid
}

// Initialize
await Promise.all([initProducts(), initOffers()])

useHead(() => ({
  title: t('catalogOffersSection.header.title')
}))
</script>
