<script setup lang="ts">
import type { DataTableLoader } from '~/components/pub/my-ui/data-table/type'
import { useUrlSearchParams } from '@vueuse/core'
import Header from '~/components/pub/my-ui/nav-header/header.vue'
import { actions, headerPrep, refSearchNav, service, summaryData, tabs } from './const'
import { defaultQuery, querySchema, tabSwitcher } from './schema.query'
import { Form } from '~/components/pub/ui/form'

// State management
const data = ref([])
const recId = ref<number>(0)
const recAction = ref<string>('')
const recItem = ref<any>(null)
const isLoading = reactive<DataTableLoader>({
  satusehatConn: true,
  isTableLoading: false,
})
const queryParams = useUrlSearchParams('history', {
  initialValue: defaultQuery,
  removeFalsyValues: true,
})
const params = computed(() => {
  const result = querySchema.safeParse(queryParams)
  return result.data
})
// Pagination state
const pagination = ref({
  total: 0,
  page: 1,
  limit: 10,
  total_pages: 0,
  has_next: false,
  has_prev: false,
})

// API function to fetch data
async function fetchData() {
  try {
    isLoading.isTableLoading = true
    data.value = []
    const response = await xfetch('/api/v1/satusehat/list', 'POST', {
      resource_type: params.value?.resource_type,
      date_from: params.value?.date_from,
      date_to: params.value?.date_to,
      search: params.value?.q,
      page: params.value?.page,
      limit: params.value?.limit,
    })

    if (response.success) {
      data.value = response.body.data
      pagination.value = response.body.meta
    }
  } catch (error) {
    console.error('Error fetching data:', error)
    data.value = []
  } finally {
    isLoading.isTableLoading = false
  }
}

async function callSatuSehat() {
  try {
    await new Promise((resolve) => setTimeout(resolve, 500))
    service.status = 'connected'
    // service.status = 'error'
    service.sessionActive = true
    // service.sessionActive = false
  } finally {
    isLoading.satusehatConn = false
  }
}

// Initialize params from URL on mount
onMounted(async () => {
  await callSatuSehat()
  await fetchData()
})

// Watch for url param changed state and trigger refetch
watch(params, () => {
  fetchData()
})

provide('rec_id', recId)
provide('rec_action', recAction)
provide('rec_item', recItem)
provide('table_data_loader', isLoading)

// Sync active tab filter with queryparams
// fallback and default to `all` filter
const activeTabFilter = computed({
  get: () => {
    const result = tabSwitcher.parse(queryParams.resource_type)
    return result
  },
  set: (value) => {
    queryParams.resource_type = value
    queryParams.q = defaultQuery.q
    queryParams.page = defaultQuery.page
    queryParams.limit = defaultQuery.limit
    queryParams.date_from = defaultQuery.date_from
    queryParams.date_to = defaultQuery.date_to
  },
})
</script>

<template>
  <div class="rounded-md border p-4">
    <Header :prep="headerPrep" :ref-search-nav="refSearchNav" />

    <div class="my-4 flex flex-1 flex-col gap-3 md:gap-4">
      <PubMyUiServiceStatus v-bind="service" />
      <AppSatusehatCardSummary :is-loading="isLoading.satusehatConn!" :summary-data="summaryData" />
    </div>

    <div class="rounded-md border p-4">
      <h2 class="text-md py-2 font-semibold">FHIR Resource</h2>
      <Tabs v-model="activeTabFilter">
        <div class="scrollbar-hide flex justify-between gap-2 overflow-x-auto">
          <TabsList>
            <TabsTrigger
              v-for="tab in tabs"
              :key="tab.value"
              :value="tab.value"
              class="flex-shrink-0 px-4 py-2 text-sm font-medium data-[state=active]:bg-green-600 data-[state=inactive]:bg-gray-100 data-[state=active]:text-white data-[state=inactive]:text-gray-700"
            >
              {{ tab.label }}
            </TabsTrigger>
          </TabsList>
          <div class="flex items-center gap-2">
            <!-- Search Input -->

            <AppSatusehatPicker />
            <div class="relative w-full max-w-sm">
              <Dialog>
                <DialogTrigger>
                  <Input type="text" placeholder="Cari pasien..." class="h-9 pl-3" />
                </DialogTrigger>
                <DialogContent>
                  <DialogHeader class="border-b-1">
                    <DialogTitle class="pb-2">Pencarian</DialogTitle>
                  </DialogHeader>
                  <Form>
                    <FormField v-slot="{ componentField }" name="username">
                      <FormItem>
                        <FormLabel>Pasien</FormLabel>
                        <FormControl>
                          <Input type="text" placeholder="nama pasien, id pasien" v-bind="componentField" />
                        </FormControl>
                      </FormItem>
                    </FormField>
                    <FormField v-slot="{ componentField }" name="status">
                      <FormItem>
                        <FormLabel>Status</FormLabel>
                        <FormControl>
                          <Select v-bind="componentField">
                            <SelectTrigger class="border border-gray-300 bg-white">
                              <SelectValue class="text-gray-400" placeholder="-- select item" />
                            </SelectTrigger>
                            <SelectContent class="bg-white">
                              <SelectItem value="0"> Gagal </SelectItem>
                              <SelectItem value="1"> Pending </SelectItem>
                              <SelectItem value="2"> Terkirim </SelectItem>
                            </SelectContent>
                          </Select>
                        </FormControl>
                      </FormItem>
                    </FormField>
                    <FormField v-slot="{ componentField }" name="fhirId">
                      <FormItem>
                        <FormLabel>FHIR ID</FormLabel>
                        <FormControl>
                          <Input type="text" placeholder="fhir id" v-bind="componentField" />
                        </FormControl>
                      </FormItem>
                    </FormField>
                  </Form>

                  <DialogFooter>
                    <Button variant="outline"> Reset </Button>
                    <Button> Apply </Button>
                  </DialogFooter>
                </DialogContent>
              </Dialog>
            </div>

            <!-- Action Buttons -->
            <AppSatusehatButtonAction
              v-for="action in actions"
              :key="action.value"
              :icon="action.icon"
              :text="action.label"
            />
          </div>
        </div>
        <div class="mt-4">
          <TabsContent v-for="tab in tabs" :key="`content-${tab.value}`" :value="tab.value">
            <div class="rounded-md border p-4">
              <AppSatusehatList v-if="!isLoading.satusehatConn" :data="data" />

              <!-- Pagination -->
              <div
                v-if="!isLoading.satusehatConn && !isLoading.isTableLoading && pagination.total > 0"
                class="mt-4 flex items-center justify-between"
              >
                <div class="text-sm text-muted-foreground">
                  Menampilkan {{ (pagination.page - 1) * pagination.limit + 1 }} -
                  {{ Math.min(pagination.page * pagination.limit, pagination.total) }}
                  dari {{ pagination.total }} data
                </div>
                <div class="flex gap-2">
                  <Button v-if="pagination.has_prev" variant="outline" size="sm" @click="queryParams.page--">
                    Sebelumnya
                  </Button>
                  <Button v-if="pagination.has_next" variant="outline" size="sm" @click="queryParams.page++">
                    Selanjutnya
                  </Button>
                </div>
              </div>
            </div>
          </TabsContent>
        </div>
      </Tabs>
    </div>
  </div>
</template>
