import apiClient from './client'; // ==================== TYPES ==================== export interface WheelPrize { id: number; display_name: string; emoji: string; color: string; prize_type: string; } export interface WheelConfig { is_enabled: boolean; name: string; spin_cost_stars: number | null; spin_cost_days: number | null; spin_cost_stars_enabled: boolean; spin_cost_days_enabled: boolean; prizes: WheelPrize[]; daily_limit: number; user_spins_today: number; can_spin: boolean; can_spin_reason: string | null; can_pay_stars: boolean; can_pay_days: boolean; user_balance_kopeks: number; required_balance_kopeks: number; has_subscription: boolean; } export interface SpinAvailability { can_spin: boolean; reason: string | null; spins_remaining_today: number; can_pay_stars: boolean; can_pay_days: boolean; min_subscription_days: number; user_subscription_days: number; } export interface SpinResult { success: boolean; prize_id: number | null; prize_type: string | null; prize_value: number; prize_display_name: string; emoji: string; color: string; rotation_degrees: number; message: string; promocode: string | null; error: string | null; } export interface SpinHistoryItem { id: number; payment_type: string; payment_amount: number; prize_type: string; prize_value: number; prize_display_name: string; emoji: string; color: string; prize_value_kopeks: number; created_at: string; } export interface SpinHistoryResponse { items: SpinHistoryItem[]; total: number; page: number; per_page: number; pages: number; } export interface StarsInvoiceResponse { invoice_url: string; stars_amount: number; } // Admin types export interface WheelPrizeAdmin { id: number; config_id: number; prize_type: string; prize_value: number; display_name: string; emoji: string; color: string; prize_value_kopeks: number; sort_order: number; manual_probability: number | null; is_active: boolean; promo_balance_bonus_kopeks: number; promo_subscription_days: number; promo_traffic_gb: number; created_at: string | null; updated_at: string | null; } // Type for creating a new prize (excludes id, config_id which are auto-generated) export interface CreateWheelPrizeData { prize_type: string; prize_value: number; display_name: string; emoji?: string; color?: string; prize_value_kopeks: number; sort_order?: number; manual_probability?: number | null; is_active?: boolean; promo_balance_bonus_kopeks?: number; promo_subscription_days?: number; promo_traffic_gb?: number; } export interface AdminWheelConfig { id: number; is_enabled: boolean; name: string; spin_cost_stars: number; spin_cost_days: number; spin_cost_stars_enabled: boolean; spin_cost_days_enabled: boolean; rtp_percent: number; daily_spin_limit: number; min_subscription_days_for_day_payment: number; promo_prefix: string; promo_validity_days: number; prizes: WheelPrizeAdmin[]; created_at: string | null; updated_at: string | null; } export interface WheelStatistics { total_spins: number; total_revenue_kopeks: number; total_payout_kopeks: number; actual_rtp_percent: number; configured_rtp_percent: number; spins_by_payment_type: Record; prizes_distribution: Array<{ prize_type: string; display_name: string; count: number; total_kopeks: number; }>; top_wins: Array<{ user_id: number; username: string | null; prize_display_name: string; prize_value_kopeks: number; created_at: string | null; }>; period_from: string | null; period_to: string | null; } export interface AdminSpinItem { id: number; user_id: number; username: string | null; payment_type: string; payment_amount: number; payment_value_kopeks: number; prize_type: string; prize_value: number; prize_display_name: string; prize_value_kopeks: number; is_applied: boolean; created_at: string; } export interface AdminSpinsResponse { items: AdminSpinItem[]; total: number; page: number; per_page: number; pages: number; } // ==================== USER API ==================== export const wheelApi = { // Get wheel config getConfig: async (): Promise => { const response = await apiClient.get('/cabinet/wheel/config'); return response.data; }, // Check spin availability checkAvailability: async (): Promise => { const response = await apiClient.get('/cabinet/wheel/availability'); return response.data; }, // Spin the wheel spin: async (paymentType: 'telegram_stars' | 'subscription_days'): Promise => { const response = await apiClient.post('/cabinet/wheel/spin', { payment_type: paymentType, }); return response.data; }, // Get spin history getHistory: async (page = 1, perPage = 20): Promise => { const response = await apiClient.get('/cabinet/wheel/history', { params: { page, per_page: perPage }, }); return response.data; }, // Create Stars invoice for Mini App payment createStarsInvoice: async (): Promise => { const response = await apiClient.post('/cabinet/wheel/stars-invoice'); return response.data; }, }; // ==================== ADMIN API ==================== export const adminWheelApi = { // Get full config getConfig: async (): Promise => { const response = await apiClient.get('/cabinet/admin/wheel/config'); return response.data; }, // Update config updateConfig: async (data: Partial): Promise => { const response = await apiClient.put('/cabinet/admin/wheel/config', data); return response.data; }, // Get prizes getPrizes: async (): Promise => { const response = await apiClient.get('/cabinet/admin/wheel/prizes'); return response.data; }, // Create prize createPrize: async (data: CreateWheelPrizeData): Promise => { const response = await apiClient.post('/cabinet/admin/wheel/prizes', data); return response.data; }, // Update prize updatePrize: async ( prizeId: number, data: Partial, ): Promise => { const response = await apiClient.put( `/cabinet/admin/wheel/prizes/${prizeId}`, data, ); return response.data; }, // Delete prize deletePrize: async (prizeId: number): Promise => { await apiClient.delete(`/cabinet/admin/wheel/prizes/${prizeId}`); }, // Reorder prizes reorderPrizes: async (prizeIds: number[]): Promise => { await apiClient.post('/cabinet/admin/wheel/prizes/reorder', { prize_ids: prizeIds }); }, // Get statistics getStatistics: async (dateFrom?: string, dateTo?: string): Promise => { const response = await apiClient.get('/cabinet/admin/wheel/statistics', { params: { date_from: dateFrom, date_to: dateTo }, }); return response.data; }, // Get all spins getSpins: async (params?: { user_id?: number; date_from?: string; date_to?: string; page?: number; per_page?: number; }): Promise => { const response = await apiClient.get('/cabinet/admin/wheel/spins', { params, }); return response.data; }, };