'use client'; import { useState, useEffect } from 'react'; import { Card } from '@/components/ui/Card'; import Button from '@/components/Button'; import toast from 'react-hot-toast'; import { API_BASE_URL } from '@/utils/constants'; import { Mail, Download, Users, TrendingUp, MapPin, UserCheck, Gift, BarChart3, Filter, FileText, } from 'lucide-react'; import { PieChart, Pie, Cell, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, } from 'recharts'; const COLORS = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899']; interface MarketingStats { totalClients: number; activeParticipants: number; inactiveParticipants: number; winners: number; nonWinners: number; byCity: Array<{ city: string; count: number }>; byAge: Array<{ range: string; count: number }>; byGender: Array<{ gender: string; count: number }>; } export default function MarketingPage() { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [exportLoading, setExportLoading] = useState(false); // Filtres d'export const [selectedSegment, setSelectedSegment] = useState('all'); const [filters, setFilters] = useState({ verified: false, city: '', gender: '', }); useEffect(() => { loadMarketingStats(); }, []); const loadMarketingStats = async () => { try { setLoading(true); const token = localStorage.getItem('auth_token') || localStorage.getItem('token'); console.log('Loading marketing stats...'); console.log('API URL:', API_BASE_URL); console.log('Token present:', !!token); const response = await fetch( `${API_BASE_URL}/admin/marketing/stats`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, } ); console.log('Response status:', response.status); if (!response.ok) { let errorMessage = 'Erreur lors du chargement'; try { const errorData = await response.json(); errorMessage = errorData.error || errorData.message || errorMessage; console.error('Error from API:', errorData); } catch (e) { console.error('Failed to parse error response'); } throw new Error(errorMessage); } const data = await response.json(); console.log('Marketing stats loaded:', data); setStats(data.data); } catch (error: any) { console.error('Error loading marketing stats:', error); toast.error(error.message || 'Erreur lors du chargement des statistiques marketing'); } finally { setLoading(false); } }; const exportSegmentData = async () => { try { setExportLoading(true); const token = localStorage.getItem('auth_token') || localStorage.getItem('token'); // Construire les critères selon le segment sélectionné const criteria: any = {}; if (selectedSegment === 'active') { criteria.hasPlayed = true; } else if (selectedSegment === 'inactive') { criteria.hasPlayed = false; } else if (selectedSegment === 'winners') { criteria.hasWon = true; } else if (selectedSegment === 'non-winners') { criteria.hasPlayed = true; criteria.hasWon = false; } const response = await fetch( `${API_BASE_URL}/admin/marketing/export`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ criteria, filters: { verified: filters.verified || undefined, city: filters.city || undefined, gender: filters.gender || undefined, }, }), } ); if (!response.ok) throw new Error('Erreur lors de l\'export'); const data = await response.json(); const users = data.data; // Créer le CSV const csvContent = [ [ 'Email', 'Prénom', 'Nom', 'Téléphone', 'Ville', 'Code Postal', 'Genre', 'Âge', 'A joué', 'A gagné', 'Nombre de tickets', ], ...users.map((user: any) => [ user.email, user.first_name || '', user.last_name || '', user.phone || '', user.city || '', user.postal_code || '', user.gender || '', user.age || '', user.has_played ? 'Oui' : 'Non', user.has_won ? 'Oui' : 'Non', user.ticket_count || 0, ]), ] .map((row) => row.join(',')) .join('\n'); // Télécharger le fichier const blob = new Blob(['\ufeff' + csvContent], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `export-marketing-${selectedSegment}-${new Date().toISOString().split('T')[0]}.csv`; link.click(); toast.success(`✅ ${users.length} contacts exportés avec succès!`); } catch (error: any) { toast.error(error.message || 'Erreur lors de l\'export'); } finally { setExportLoading(false); } }; if (loading) { return (

Chargement des données marketing...

); } if (!stats) { return (
Erreur lors du chargement des statistiques marketing
); } return (
{/* En-tête */}

Données Marketing

Statistiques et export des données pour vos campagnes d'emailing

{/* Statistiques globales */}

Total Clients

{stats.totalClients.toLocaleString()}

Participants Actifs

{stats.activeParticipants.toLocaleString()}

{((stats.activeParticipants / stats.totalClients) * 100).toFixed(1)}% du total

Gagnants

{stats.winners.toLocaleString()}

{((stats.winners / stats.activeParticipants) * 100).toFixed(1)}% de conversion

Inactifs

{stats.inactiveParticipants.toLocaleString()}

À réactiver

{/* Graphiques */}
{/* Répartition par genre */}

Répartition par Genre

`${entry.gender}: ${entry.count}`} > {stats.byGender.map((entry, index) => ( ))}
{/* Répartition par âge */}

Répartition par Âge

{/* Top villes */}

Top Villes ({stats.byCity.length})

{stats.byCity.slice(0, 10).map((city, index) => (

#{index + 1}

{city.city}

{city.count}

))}
{/* Section Export */}

Exporter les Données pour Emailing

{/* Sélection du segment */}
{/* Filtres additionnels */}
{/* Boutons d'action */}

Note: L'export générera un fichier CSV avec les emails, noms, prénoms et autres données de contact. Utilisez ce fichier pour vos campagnes d'emailing avec votre outil préféré (Mailchimp, SendGrid, etc.).

); }