import React, { useState, useMemo, useEffect } from 'react'; import { useCustomerDiscountUsageReport } from '../core/_hooks'; import { CustomerDiscountUsageFilters } from '../core/_models'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { Table } from '@/components/ui/Table'; import { TableColumn } from '@/types'; import { JalaliDateTimePicker } from '@/components/ui/JalaliDateTimePicker'; import { PageContainer, PageTitle } from '@/components/ui/Typography'; import { Pagination } from '@/components/ui/Pagination'; import { Filter, TrendingUp, Users, DollarSign, Hash, X } from 'lucide-react'; import { formatWithThousands, persianToEnglish } from '@/utils/numberUtils'; import { formatCurrency, formatDateTime } from '@/utils/formatters'; import { ReportSkeleton } from '@/components/common/ReportSkeleton'; import { useSearchUsers, useUsers } from '@/pages/users-admin/core/_hooks'; import { UserFilters } from '@/pages/users-admin/core/_models'; const CustomerDiscountUsagePage = () => { const [filters, setFilters] = useState({ user_id: 0, limit: 50, offset: 0, }); const [tempFilters, setTempFilters] = useState({ user_id: 0, limit: 50, offset: 0, }); const [refetchKey, setRefetchKey] = useState(0); const [userSearchText, setUserSearchText] = useState(''); const [userSearchDebounced, setUserSearchDebounced] = useState(''); const [userDropdownOpen, setUserDropdownOpen] = useState(false); useEffect(() => { const t = setTimeout(() => setUserSearchDebounced(userSearchText), 300); return () => clearTimeout(t); }, [userSearchText]); const { data: usersList } = useUsers({ limit: 20, offset: 0 }); const userSearchFilters = useMemo(() => userSearchDebounced ? { search_text: userSearchDebounced, limit: 20, offset: 0 } : {}, [userSearchDebounced]); const { data: userSearchData } = useSearchUsers(userSearchFilters); const userOptions = userSearchDebounced ? (userSearchData?.users || []) : (usersList || []); const filtersWithKey = useMemo(() => ({ ...filters, _refetchKey: refetchKey, }), [filters, refetchKey]); const { data, isLoading, error } = useCustomerDiscountUsageReport(filtersWithKey as CustomerDiscountUsageFilters & { _refetchKey?: number }); const handleTempFilterChange = (key: keyof CustomerDiscountUsageFilters, value: any) => { setTempFilters(prev => ({ ...prev, [key]: value, })); }; const handleDateRangeChange = (from: string | undefined, to: string | undefined) => { setTempFilters(prev => ({ ...prev, date_range: { from, to, }, })); }; const handleNumericFilterChange = (key: 'discount_id', raw: string) => { const converted = persianToEnglish(raw).replace(/[^\d]/g, ''); const numeric = converted ? Number(converted) : undefined; handleTempFilterChange(key, numeric); }; const handleSelectUser = (user: { id: number; phone_number?: string; first_name?: string; last_name?: string }) => { handleTempFilterChange('user_id', user.id); setUserSearchText(user.phone_number || `${user.first_name || ''} ${user.last_name || ''}`.trim() || String(user.id)); setUserDropdownOpen(false); }; const handleApplyFilters = () => { const newFilters = { ...tempFilters, offset: 0, }; setFilters(newFilters); setRefetchKey(prev => prev + 1); }; const handlePageChange = (page: number) => { setFilters(prev => ({ ...prev, offset: (page - 1) * prev.limit, })); }; const handleClearFilters = () => { const clearedFilters = { user_id: 0, limit: 50, offset: 0, }; setTempFilters(clearedFilters); setFilters(clearedFilters); setUserSearchText(''); }; const columns: TableColumn[] = [ { key: 'discount_code', label: 'کد تخفیف', align: 'right', }, { key: 'discount_name', label: 'نام کد تخفیف', align: 'right', }, { key: 'order_number', label: 'شماره سفارش', align: 'right', }, { key: 'amount', label: 'مبلغ تخفیف', align: 'right', }, { key: 'used_at', label: 'زمان استفاده', align: 'right', }, ]; const tableData = (data?.usages || []).map(usage => ({ discount_code: usage.discount_code, discount_name: usage.discount_name, order_number: usage.order_number || '-', amount: formatCurrency(usage.amount), used_at: formatDateTime(usage.used_at), })); const currentPage = Math.floor(filters.offset / filters.limit) + 1; const totalPages = data ? Math.ceil(data.total / filters.limit) : 1; return ( گزارش استفاده کاربر خاص از کدهای تخفیف {/* Filters */}

فیلترها

توجه: برای مشاهده گزارش، کاربر را از لیست انتخاب کنید یا با شماره موبایل جستجو کنید. این فیلد الزامی است.

{ setUserSearchText(persianToEnglish(e.target.value)); setUserDropdownOpen(true); if (tempFilters.user_id) handleTempFilterChange('user_id', 0); }} onFocus={() => setUserDropdownOpen(true)} onBlur={() => setTimeout(() => setUserDropdownOpen(false), 150)} placeholder="جستجو با شماره موبایل یا انتخاب از لیست" /> {userDropdownOpen && (
{(userSearchDebounced ? (userSearchData?.users ?? []) : (usersList ?? [])).length === 0 && (
کاربری یافت نشد
)} {(userSearchDebounced ? (userSearchData?.users ?? []) : (usersList ?? [])).map((user: { id: number; phone_number?: string; first_name?: string; last_name?: string }) => ( ))}
)}
handleTempFilterChange('discount_code', e.target.value || undefined)} placeholder="مثلاً SUMMER2025" />
handleNumericFilterChange('discount_id', e.target.value)} placeholder="مثلاً 123" numeric />
handleDateRangeChange(value, tempFilters.date_range?.to)} placeholder="انتخاب تاریخ شروع" />
handleDateRangeChange(tempFilters.date_range?.from, value)} placeholder="انتخاب تاریخ پایان" />
{/* Summary Cards */} {data?.summary && (

کل استفاده‌ها

{formatWithThousands(data.summary.total_usages)}

مجموع تخفیف دریافتی

{formatCurrency(data.summary.total_discount_amount)}

کدهای متفاوت

{formatWithThousands(data.summary.unique_codes)}

میانگین تخفیف هر سفارش

{formatCurrency(data.summary.average_discount_per_order)}

)} {/* Table */} {isLoading ? ( ) : error ? (

خطا در دریافت داده‌ها

) : filters.user_id === 0 ? (

لطفاً شناسه کاربر را وارد کنید

) : ( <>
{data && data.total > 0 && totalPages > 1 && (
)} {data && data.total === 0 && (

داده‌ای یافت نشد

)} )} ); }; export default CustomerDiscountUsagePage;