import { useEffect, useState } from 'react'; import { useParams, useNavigate, useSearchParams } from 'react-router-dom'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Button } from '../ui/button'; import { Badge } from '../ui/badge'; import { CheckCircle2, Calendar, Clock, User, FileText, Star, ArrowLeft, Award, Quote, XCircle, AlertTriangle } from 'lucide-react'; import { useLanguage } from '../../lib/languageContext'; import { translations } from '../../lib/translations'; import { useAuth } from '../../lib/authContext'; import { fetchSessionReview, submitSessionReview } from '../../lib/api/bookingApi'; import { getApiBaseUrl } from '../../lib/api/config'; export function SessionReport() { const { id } = useParams(); const [searchParams] = useSearchParams(); const reviewMode = searchParams.get('mode') === 'review'; const navigate = useNavigate(); const { language } = useLanguage(); const { user } = useAuth(); const t = (translations[language] as any).sessionReport || { title: 'Session Summary', subtitle: 'Great job completing your session!', duration: 'Actual Duration', notes: "Sheikh's Observations", backHome: 'Back to Dashboard', reviewSectionTitle: 'Your Review', date: 'Date', teacher: 'Teacher', completed: 'Completed', minutes: 'minutes', noNotes: 'No notes were provided for this session.', }; const isAr = language === 'ar'; const [session, setSession] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [sessionReview, setSessionReview] = useState(null); const [loadingReview, setLoadingReview] = useState(false); // ── Review form state ──────────────────────────────────────── const [hoveredStar, setHoveredStar] = useState(0); const [selectedStar, setSelectedStar] = useState(0); const [reviewComment, setReviewComment] = useState(''); const [submitting, setSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); const [submitSuccess, setSubmitSuccess] = useState(false); useEffect(() => { const fetchSession = async () => { if (!id || !user) return; try { const token = localStorage.getItem('authToken'); const BASE_URL = getApiBaseUrl(); const rolePath = user.role === 'sheikh' ? 'sheikh' : 'student'; const response = await fetch(`${BASE_URL}/api/${rolePath}/sessions/${id}`, { headers: { 'Authorization': `Bearer ${token}` }, }); if (!response.ok) throw new Error('Session not found'); const data = await response.json(); const scheduledDate = data.scheduledStart ? new Date(data.scheduledStart) : data.scheduledStartDate && data.scheduledStartTime ? new Date(`${data.scheduledStartDate}T${data.scheduledStartTime}`) : undefined; setSession({ id: (data.id || data.sessionId).toString(), studentName: data.studentName || '', sheikhName: data.sheikhName || '', scheduledDate, duration: data.duration ?? 60, sessionNotes: data.sessionNotes || '', sessionStatus: data.sessionStatus || data.status || '', }); } catch (err) { console.error(err); setError('Session summary could not be loaded.'); } finally { setLoading(false); } }; fetchSession(); }, [id, user]); useEffect(() => { if (!id || !session) return; setLoadingReview(true); fetchSessionReview(Number(id), user?.role) .then(setSessionReview) .catch(() => setSessionReview(null)) .finally(() => setLoadingReview(false)); }, [id, session, user]); const handleSubmitReview = async () => { if (!selectedStar || !id) return; setSubmitting(true); setSubmitError(null); try { await submitSessionReview(Number(id), { rating: selectedStar, notes: reviewComment }); setSubmitSuccess(true); // Refresh the review display const updated = await fetchSessionReview(Number(id), user?.role); setSessionReview(updated); } catch { setSubmitError(isAr ? 'فشل إرسال التقييم. حاول مرة أخرى.' : 'Failed to submit review. Please try again.'); } finally { setSubmitting(false); } }; if (loading) { return
Loading session report...
; } if (error || !session) { return (

{error || 'Session not found.'}

); } const isMissed = session.sessionStatus === 'MISSED' || session.sessionStatus === 'CANCELLED'; const isStudent = user?.role === 'student'; const existingRate: number | null = sessionReview?.studentRate ?? null; const existingComment: string | null = sessionReview?.studentReview ?? null; const existingDate: string | null = sessionReview?.reviewedAt ?? null; const reviewerName: string | null = sessionReview?.studentName ?? null; const canLeaveReview = reviewMode && isStudent && existingRate == null && !submitSuccess; return (
{/* Back Button */} {/* Header */}
{isMissed ? : }

{isMissed ? (isAr ? 'الجلسة لم تُعقد' : 'Session Was Missed') : t.title}

{isMissed ? (isAr ? 'لم يحضر الشيخ في الوقت المحدد.' : 'The sheikh did not show up in time.') : t.subtitle}

{/* Overview Cards */}
{/* Duration */}
{isMissed ? 0 : session.duration}
{t.minutes}
{/* Teacher */}
{t.teacher}
{session.sheikhName}
{/* Date */}
{t.date}
{session.scheduledDate?.toLocaleDateString(isAr ? 'ar-EG' : 'en-US', { month: 'short', day: 'numeric', year: 'numeric', })}
{/* Status */}
Status
{isMissed ? ( {isAr ? 'فائتة' : 'Missed'} ) : ( {t.completed} )}
{/* Sheikh's Notes — only shown for completed sessions */} {!isMissed && ( {t.notes}

{session.sessionNotes || t.noNotes}

)} {/* ── Review Section ──────────────────────────────────────── */} {user?.role === 'sheikh' ? (isAr ? 'تقييم الطالب' : 'Student Review') : (isAr ? 'تقييمك' : t.reviewSectionTitle)} {loadingReview ? (

{isAr ? 'جارٍ التحميل...' : 'Loading review...'}

) : (existingRate != null || submitSuccess) ? ( /* ── Existing / just-submitted review display ── */
{submitSuccess && (
{isAr ? 'تم إرسال تقييمك بنجاح!' : 'Your review was submitted successfully!'}
)}
{Array.from({ length: 5 }).map((_, i) => ( ))}
{(existingComment || reviewComment) && (

{existingComment || reviewComment}

)}
{reviewerName && user?.role === 'sheikh' && {reviewerName}} {reviewerName && user?.role === 'sheikh' && } {existingDate && ( {new Date(existingDate).toLocaleDateString(isAr ? 'ar-EG' : 'en-US', { month: 'short', day: 'numeric', year: 'numeric', })} )}
) : canLeaveReview ? ( /* ── Review submission form (student, no review yet) ── */
{isMissed && (
{isAr ? 'الشيخ لم يحضر الجلسة. يمكنك تقييم تجربتك.' : 'The sheikh missed this session. You can still leave a review of your experience.'}
)}

{isAr ? 'كيف تقيّم هذه التجربة؟' : 'How would you rate this experience?'}

{Array.from({ length: 5 }).map((_, i) => { const val = i + 1; const filled = val <= (hoveredStar || selectedStar); return ( ); })}
{selectedStar > 0 && (

{['', isAr ? 'سيئ جداً' : 'Very poor', isAr ? 'سيئ' : 'Poor', isAr ? 'مقبول' : 'Fair', isAr ? 'جيد' : 'Good', isAr ? 'ممتاز' : 'Excellent'][selectedStar]}

)}