# 094: Expense Tracker
# Track spending with categories and insights

state expenses = load "expenses" locally or []
state budget = load "budget" locally or { monthly: 2000 }

# Add expense
form add_expense:
  input amount -> new_expense.amount
    type: "number"
    placeholder: "0.00"

  input description -> new_expense.description
    placeholder: "What was this for?"

  select category -> new_expense.category
    options: ["Food", "Transport", "Entertainment", "Bills", "Shopping", "Other"]

  date_picker date -> new_expense.date
    default: today()

  button "Add Expense" -> save_expense(new_expense)

save_expense(exp):
  exp.id = generate_id()
  exp.created_at = now()

  expenses.append(exp)
  store expenses locally as "expenses"

  new_expense = {}
  show "Expense added"

# Delete expense
delete_expense(id):
  expenses = expenses.filter(e => e.id != id)
  store expenses locally as "expenses"

# Analytics
computed this_month_expenses = expenses.filter(e => {
  is_this_month(e.date)
})

computed total_this_month = this_month_expenses
  .reduce((sum, e) => sum + e.amount, 0)

computed by_category = this_month_expenses
  .group_by(e => e.category)
  .map(group => ({
    category: group.key,
    total: group.items.reduce((sum, e) => sum + e.amount, 0),
    count: group.items.length
  }))
  .sort_by(g => g.total)
  .reverse()

computed budget_remaining = budget.monthly - total_this_month

computed is_over_budget = total_this_month > budget.monthly

# Display summary
show_card:
  title: "This Month"
  value: "${total_this_month.toFixed(2)}"
  subtitle: "of ${budget.monthly} budget"

  if is_over_budget:
    show_warning "Over budget by ${(total_this_month - budget.monthly).toFixed(2)}"
  else:
    show_success "${budget_remaining.toFixed(2)} remaining"

# Category breakdown
show "Spending by Category"
for cat in by_category:
  show_category_bar:
    name: cat.category
    amount: cat.total
    percent: (cat.total / total_this_month * 100).toFixed(1)

# Recent expenses
show "Recent Expenses"
for exp in expenses.sort_by(e => e.created_at).reverse().take(10):
  show_expense_row:
    description: exp.description
    category: exp.category
    amount: "${exp.amount.toFixed(2)}"
    date: format_date(exp.date)
    on_delete: () => delete_expense(exp.id)

# AI Insights
button "Get Spending Insights" -> show_insights()

show_insights():
  ### Intent: Analyze spending patterns and provide insights
  insights = ai.analyze(expenses, {
    focus: "patterns, unusual spending, savings opportunities"
  })

  show insights

# Export
button "Export to CSV" -> export_data()

export_data():
  csv = ai.transform(expenses, { to: "csv" })
  save_file("expenses.csv", csv)

generate_id():
  return now() + Math.random()

is_this_month(date):
  return date.month == today().month and date.year == today().year
