export const useBiFilters = () => { const route = useRoute() const period = useState('bi_period', () => route.query?.period as string ?? 'last_week') const orgId = useState('bi_org_id', () => route.query?.org_id as string ?? '') const orgName = useState('bi_org_name', () => '') const periodOptions = [ { label: 'Today', value: 'today' }, { label: 'Yesterday', value: 'yesterday' }, { label: '7 Days', value: 'last_week' }, { label: '30 Days', value: 'last_month' }, { label: 'Quarter', value: 'last_quarter' }, { label: '1 Year', value: 'last_year' }, ] const setPeriod = (val: string) => { period.value = val } const setOrg = (id: string, name: string = '') => { orgId.value = id orgName.value = name } const clearOrg = () => { orgId.value = '' orgName.value = '' } const queryParams = computed(() => { const params: Record = { period: period.value } if (orgId.value) { params.org_id = orgId.value } return params }) const queryString = computed(() => { const parts: string[] = [`period=${period.value}`] if (orgId.value) { parts.push(`org_id=${orgId.value}`) } return parts.join('&') }) return { period, orgId, orgName, periodOptions, setPeriod, setOrg, clearOrg, queryParams, queryString, } } export const useBiDashboard = () => { const loading = useState('bi_loading', () => false) const kpis = useState('bi_kpis', () => ({})) const salesOverview = useState('bi_sales_overview', () => []) const { queryString } = useBiFilters() const fetchKpis = async () => { loading.value = true try { const res = await $fetch(`/api/bi/kpis?${queryString.value}`) kpis.value = res || {} } catch (e) { console.error('Failed to fetch KPIs:', e) } finally { loading.value = false } } const fetchSalesOverview = async () => { try { const res: any = await $fetch(`/api/bi/sales-overview?${queryString.value}`) salesOverview.value = res?.records || [] } catch (e) { console.error('Failed to fetch sales overview:', e) } } const refreshAll = async () => { await Promise.all([fetchKpis(), fetchSalesOverview()]) } return { loading, kpis, salesOverview, fetchKpis, fetchSalesOverview, refreshAll, } }