import api from './api'; export type Sweepstake = { id: number; title: string; description?: string; image_url?: string; rules_url?: string; start_at: string; end_at: string; status: string; picker_style?: 'wheel' | 'cycler' | string; total_prizes?: number; prize_summary?: string; entry_cost_points?: number; entry_fee_czk?: number; max_entries_per_user?: number; winners_selected_at?: string | null; visibility_until?: string | null; }; export type SweepstakePrize = { id: number; sweepstake_id: number; name: string; description?: string; image_url?: string; value?: string; quantity: number; display_order: number; kind?: 'physical' | 'points' | 'xp' | 'points_xp'; points?: number; xp?: number; }; export type SweepstakeWinner = { id: number; sweepstake_id: number; entry_id: number; user_id: number; prize_id?: number | null; prize_name?: string; claim_status: string; announced_at?: string | null; }; export type CurrentSweepstakeResponse = { sweepstake: Sweepstake | null; prizes?: SweepstakePrize[]; winners?: SweepstakeWinner[]; state?: 'upcoming' | 'active' | 'finalized'; has_entered?: boolean; visual_played_at?: string | null; }; export async function getCurrentSweepstake(): Promise { const res = await api.get('/sweepstakes/current'); return res.data; } export async function enterSweepstake(id: number): Promise { await api.post(`/sweepstakes/${id}/enter`, {}); } export async function markSweepstakeVisualPlayed(id: number): Promise { await api.post(`/sweepstakes/${id}/played`, {}); } export async function getMyWinnings(): Promise<{ items: SweepstakeWinner[] }> { const res = await api.get('/sweepstakes/my-winnings'); return res.data; } // Admin export async function adminListSweepstakes(params?: { status?: string }) { const res = await api.get('/admin/sweepstakes', { params }); return res.data?.items || []; } export async function adminCreateSweepstake(data: Partial & { start_at: string; end_at: string }) { const res = await api.post('/admin/sweepstakes', data); return res.data; } export async function adminUpdateSweepstake(id: number, data: Partial) { const res = await api.put(`/admin/sweepstakes/${id}`, data); return res.data; } export async function adminDeleteSweepstake(id: number) { const res = await api.delete(`/admin/sweepstakes/${id}`); return res.data; } export async function adminListEntries(id: number) { const res = await api.get(`/admin/sweepstakes/${id}/entries`); return res.data?.items || []; } export async function adminListWinners(id: number) { const res = await api.get(`/admin/sweepstakes/${id}/winners`); return res.data?.items || []; } export async function adminFinalizeSweepstake(id: number, seed?: string) { const res = await api.post(`/admin/sweepstakes/${id}/finalize`, seed ? { seed } : {}); return res.data; } // Visualizer data export type VisualEntry = { user_id: number; display_name: string; avatar_url?: string }; export type VisualWinner = { id?: number; user_id: number; prize_name?: string; claim_status?: string }; export type VisualData = { sweepstake: Sweepstake; entries: VisualEntry[]; winners: VisualWinner[] }; export async function adminGetVisualData(id: number): Promise { const res = await api.get(`/admin/sweepstakes/${id}/visual`); return res.data; } export async function getPublicVisualData(id: number): Promise { const res = await api.get(`/sweepstakes/${id}/visual`); return res.data; } // Prizes CRUD export type SweepstakePrizeInput = Partial & { name?: string; quantity?: number; display_order?: number; kind?: 'physical' | 'points' | 'xp' | 'points_xp'; points?: number; xp?: number; }; export async function adminListPrizes(id: number): Promise { const res = await api.get(`/admin/sweepstakes/${id}/prizes`); return res.data?.items || []; } export async function adminCreatePrize(id: number, data: SweepstakePrizeInput) { const res = await api.post(`/admin/sweepstakes/${id}/prizes`, data); return res.data; } export async function adminUpdatePrize(id: number, prizeId: number, data: SweepstakePrizeInput) { const res = await api.put(`/admin/sweepstakes/${id}/prizes/${prizeId}`, data); return res.data; } export async function adminDeletePrize(id: number, prizeId: number) { const res = await api.delete(`/admin/sweepstakes/${id}/prizes/${prizeId}`); return res.data; } export async function adminReorderPrizes(id: number, order: number[]) { const res = await api.post(`/admin/sweepstakes/${id}/prizes/reorder`, { order }); return res.data; } // Winners management export async function adminUpdateWinner(id: number, winnerId: number, data: { claim_status?: 'pending'|'claimed'|'delivered'; claim_note?: string }) { const res = await api.patch(`/admin/sweepstakes/${id}/winners/${winnerId}`, data); return res.data; } export async function adminSetWinnerPrize(id: number, winnerId: number, prizeId: number) { const res = await api.patch(`/admin/sweepstakes/${id}/winners/${winnerId}/prize`, { prize_id: prizeId }); return res.data; }