import React, { useState } from 'react'; import { StyleSheet, TouchableOpacity, ScrollView } from 'react-native'; import { View, Text, useTheme } from '@bettoredge/styles'; import { Ionicons } from '@expo/vector-icons'; import type { CalcuttaRoundProps, CalcuttaAuctionItemProps, CalcuttaItemResultProps, CalcuttaPayoutRuleProps, } from '@bettoredge/types'; import { useCalcuttaResults, RoundResultSummary } from '../hooks/useCalcuttaResults'; import { formatCurrency, getStatusLabel } from '../helpers/formatting'; export interface CalcuttaRoundResultsProps { rounds: CalcuttaRoundProps[]; items: CalcuttaAuctionItemProps[]; item_results: CalcuttaItemResultProps[]; payout_rules: CalcuttaPayoutRuleProps[]; market_type: string; total_pot?: number; unclaimed_pot?: number; auction_type?: string; } export const CalcuttaRoundResults: React.FC = ({ rounds, items, item_results, payout_rules, market_type, total_pot, unclaimed_pot, auction_type, }) => { const isSweepstakes = auction_type === 'sweepstakes'; const { theme } = useTheme(); const { roundSummaries } = useCalcuttaResults(rounds, items, item_results, payout_rules); const [expandedRound, setExpandedRound] = useState(null); if (rounds.length === 0) { return ( No rounds yet ); } const toggleRound = (roundId: string) => { setExpandedRound(prev => prev === roundId ? null : roundId); }; const renderRound = (summary: RoundResultSummary) => { const isExpanded = expandedRound === summary.round.calcutta_round_id; const statusColor = summary.round.status === 'closed' ? theme.colors.status.success : summary.round.status === 'inprogress' ? theme.colors.primary.default : theme.colors.text.tertiary; return ( toggleRound(summary.round.calcutta_round_id)} activeOpacity={0.7} > {summary.round.round_name} {getStatusLabel(summary.round.status)} {!isSweepstakes && summary.total_payout > 0 && ( {formatCurrency(summary.total_payout, market_type)} paid )} {isSweepstakes && summary.round.prize_description && ( Prize available )} {summary.advanced_items.length}/{summary.advanced_items.length + summary.eliminated_items.length} advanced {isExpanded && ( {/* Sweepstakes: show prize instead of payout rule */} {isSweepstakes && summary.round.prize_description && ( Prize: {summary.round.prize_description} )} {/* Payout rule (non-sweepstakes) */} {!isSweepstakes && summary.payout_rule && ( {summary.payout_rule.payout_pct}% of pot split among advancing teams )} {/* Rollover notice for unsold advancing items (non-sweepstakes) */} {!isSweepstakes && summary.round.status === 'closed' && summary.advanced_items.some(i => !i.winning_player_id) && ( Unbid teams' share rolls into the next round. Any amount remaining after the final round is redistributed to all players proportionally. )} {/* Advanced items */} {summary.advanced_items.length > 0 && ( <> Advanced ({summary.advanced_items.length}) {summary.advanced_items.map(item => { const isUnsold = !item.winning_player_id; return ( {item.item_name}{isUnsold ? ' (unbid)' : ''} {item.seed != null && ( #{item.seed} )} ); })} )} {/* Eliminated items */} {summary.eliminated_items.length > 0 && ( <> Eliminated ({summary.eliminated_items.length}) {summary.eliminated_items.map(item => { const isUnsold = !item.winning_player_id; return ( {item.item_name}{isUnsold ? ' (unbid)' : ''} {item.seed != null && ( #{item.seed} )} ); })} )} {summary.advanced_items.length === 0 && summary.eliminated_items.length === 0 && ( No results yet for this round )} )} ); }; return ( {roundSummaries.map(renderRound)} ); }; const styles = StyleSheet.create({ container: { flex: 1, }, emptyContainer: { alignItems: 'center', padding: 20, }, roundCard: { borderBottomWidth: 1, }, roundHeader: { flexDirection: 'row', alignItems: 'center', padding: 12, }, roundInfo: { flex: 1, }, roundMeta: { flexDirection: 'row', alignItems: 'center', marginTop: 4, }, statusDot: { width: 6, height: 6, borderRadius: 3, marginRight: 6, }, roundCounts: { marginHorizontal: 10, }, chevron: { marginLeft: 4, }, roundBody: { paddingHorizontal: 12, paddingBottom: 12, borderTopWidth: 1, }, payoutRow: { flexDirection: 'row', alignItems: 'center', paddingVertical: 8, }, sectionLabel: { marginTop: 8, marginBottom: 4, }, itemRow: { flexDirection: 'row', alignItems: 'center', paddingVertical: 4, paddingLeft: 4, }, itemName: { flex: 1, marginLeft: 6, }, noResults: { paddingVertical: 8, textAlign: 'center', }, });