import { defineStore } from 'pinia' import { ref } from 'vue' import { api } from '@/services/api' import type { Category } from './categories' export interface RecurringExpense { id: number name: string expected_amount: number day_of_month: number category_id: number | null active: boolean created_at: string updated_at: string } export interface RecurringStatus extends RecurringExpense { covered: boolean ignored: boolean reason?: string } export const useRecurringStore = defineStore('recurring', () => { const items = ref([]) const monthlyStatus = ref([]) const loading = ref(false) const error = ref(null) async function fetchAll() { loading.value = true error.value = null try { items.value = await api.get('/recurring') } catch (e: any) { error.value = e.message } finally { loading.value = false } } async function fetchMonthlyStatus(month: string) { try { monthlyStatus.value = await api.get(`/recurring/status?month=${month}`) } catch { monthlyStatus.value = [] } } async function create(input: Omit) { const item = await api.post('/recurring', input) items.value.push(item) return item } async function update(id: number, input: Omit) { const item = await api.put(`/recurring/${id}`, input) const idx = items.value.findIndex((x) => x.id === id) if (idx !== -1) items.value[idx] = item return item } async function remove(id: number) { await api.delete(`/recurring/${id}`) items.value = items.value.filter((x) => x.id !== id) } async function ignore(id: number, month: string, reason: string) { await api.post(`/recurring/${id}/ignore`, { month, reason }) await fetchMonthlyStatus(month) } async function unignore(id: number, month: string) { await api.delete(`/recurring/${id}/ignore?month=${month}`) await fetchMonthlyStatus(month) } const pendingCount = (month: string) => monthlyStatus.value.filter((s) => !s.covered).length return { items, monthlyStatus, loading, error, fetchAll, fetchMonthlyStatus, create, update, remove, ignore, unignore, pendingCount } })