import { create } from "zustand"; export type OddsFormat = "decimal" | "fractional" | "american"; export type Bet = { id: string; event: string; league: string; market: string; selection: string; odds: number; stake?: number; }; type BetslipState = { bets: Bet[]; oddsFormat: OddsFormat; defaultStake: number; addBet: (bet: Bet) => void; removeBet: (id: string) => void; clearBets: () => void; updateStake: (id: string, stake: number) => void; setOddsFormat: (format: OddsFormat) => void; setDefaultStake: (stake: number) => void; getTotalOdds: () => number; getTotalStake: () => number; getPotentialWin: () => number; }; export const useBetslipStore = create((set, get) => ({ bets: [], oddsFormat: "decimal", defaultStake: 10, addBet: (bet) => set((state) => { const exists = state.bets.some((b) => b.id === bet.id); if (exists) { // Toggle off if already selected return { bets: state.bets.filter((b) => b.id !== bet.id) }; } return { bets: [...state.bets, { ...bet, stake: state.defaultStake }] }; }), removeBet: (id) => set((state) => ({ bets: state.bets.filter((bet) => bet.id !== id), })), clearBets: () => set({ bets: [] }), updateStake: (id, stake) => set((state) => ({ bets: state.bets.map((b) => (b.id === id ? { ...b, stake } : b)), })), setOddsFormat: (format) => set({ oddsFormat: format }), setDefaultStake: (stake) => set({ defaultStake: stake }), getTotalOdds: () => { const bets = get().bets; if (bets.length === 0) return 0; return bets.reduce((acc, b) => acc * b.odds, 1); }, getTotalStake: () => { const bets = get().bets; return bets.reduce((acc, b) => acc + (b.stake ?? 0), 0); }, getPotentialWin: () => { const bets = get().bets; if (bets.length === 0) return 0; if (bets.length === 1) { const b = bets[0]; return (b.stake ?? 0) * b.odds; } // Accumulator: use first bet's stake const stake = bets[0].stake ?? 0; const totalOdds = bets.reduce((acc, b) => acc * b.odds, 1); return stake * totalOdds; }, }));