File size: 3,241 Bytes
7d8aa82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { prisma } from '../lib/prisma'

export async function handlePool(subcommand: string, opts: Record<string, any>): Promise<string> {
  if (subcommand === 'list') {
    try {
      const pools = await prisma.moneyPool.findMany({ where: { status: 'active' }, orderBy: { createdAt: 'desc' } })
      if (!pools.length) return '**Money Pools**\nNo active pools. Create one with `/pool create name:my-pool`'
      const lines = pools.map(p => {
        const pct = p.targetAmount ? ` — ${Math.round((p.balance / p.targetAmount) * 100)}% of $${p.targetAmount.toLocaleString()} goal` : ''
        return `• **${p.name}** $${p.balance.toLocaleString()}${pct}\n  ${p.purpose}`
      }).join('\n')
      return `**Active Money Pools**\n${lines}`
    } catch { return '**Money Pools**\nDatabase unreachable.' }
  }

  if (subcommand === 'create') {
    const { name, purpose, goal } = opts
    if (!name) return 'Pool name required. Use `/pool create name:my-pool`'
    try {
      const pool = await prisma.moneyPool.create({
        data: { name, purpose: purpose || name, targetAmount: goal ?? null },
      })
      const goalStr = pool.targetAmount != null ? ` Goal: $${pool.targetAmount.toLocaleString()}.` : ''
      return `**Pool Created**\n**${pool.name}** — ${pool.purpose}${goalStr}\nBalance: $0. Fund it with \`/pool fund name:${pool.name} amount:1000\``
    } catch { return `Couldn't create pool "${name}". It may already exist.` }
  }

  if (subcommand === 'fund') {
    const { name, amount } = opts
    if (!name || !amount) return 'Name and amount required. Use `/pool fund name:my-pool amount:1000`'
    try {
      const pool = await prisma.moneyPool.findFirst({ where: { name, status: 'active' } })
      if (!pool) return `Pool "${name}" not found. Use \`/pool list\` to see active pools.`
      const txs = Array.isArray(pool.transactions) ? pool.transactions as any[] : []
      const updated = await prisma.moneyPool.update({
        where: { id: pool.id },
        data: {
          balance: pool.balance + Number(amount),
          transactions: [...txs, { amount: Number(amount), ts: new Date().toISOString(), type: 'fund', via: 'discord' }],
        },
      })
      const pct = updated.targetAmount ? ` (${Math.round((updated.balance / updated.targetAmount) * 100)}% of goal)` : ''
      return `**Pool Funded**\n**${name}** → +$${Number(amount).toLocaleString()}\nNew balance: **$${updated.balance.toLocaleString()}**${pct}`
    } catch { return `Couldn't fund pool "${name}". Database error.` }
  }

  if (subcommand === 'close') {
    const { name } = opts
    if (!name) return 'Pool name required.'
    try {
      const pool = await prisma.moneyPool.findFirst({ where: { name, status: 'active' } })
      if (!pool) return `Pool "${name}" not found or already closed.`
      await prisma.moneyPool.update({ where: { id: pool.id }, data: { status: 'closed' } })
      return `**Pool Closed**\n"${name}" archived. Final balance: $${pool.balance.toLocaleString()}.`
    } catch { return `Couldn't close pool "${name}". Database error.` }
  }

  return 'Unknown pool subcommand. Use: `/pool create`, `/pool list`, `/pool fund`, `/pool close`'
}