'use client'; import { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { Calendar, Home, User, Mail, Phone, DollarSign, CheckCircle, XCircle, Clock, MapPin, Bed, Bath, Square, CalendarDays, ChevronLeft, ChevronRight, Eye, MessageCircle, ArrowLeft, Loader2, Filter, Search, Download, TrendingUp, Users, Building } from 'lucide-react'; import toast, { Toaster } from 'react-hot-toast'; import AuthService from '../../services/AuthService'; import Image from 'next/image'; const OwnerBookingCalendar = ({ property, onDateSelect, selectedDates }) => { const [currentMonth, setCurrentMonth] = useState(new Date()); const [hoverDate, setHoverDate] = useState(null); const daysInMonth = new Date( currentMonth.getFullYear(), currentMonth.getMonth() + 1, 0 ).getDate(); const firstDayOfMonth = new Date( currentMonth.getFullYear(), currentMonth.getMonth(), 1 ).getDay(); const monthNames = [ 'يناير', 'فبراير', 'مارس', 'إبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر' ]; const isDateBooked = (date) => { if (!property?.bookings) return false; const dateStr = date.toISOString().split('T')[0]; return property.bookings.some(booking => { const start = new Date(booking.startDate); const end = new Date(booking.endDate); const current = new Date(date); return current >= start && current <= end; }); }; const isDateSelected = (date) => { if (!selectedDates) return false; const dateStr = date.toISOString().split('T')[0]; return dateStr === selectedDates.start || dateStr === selectedDates.end; }; const isInRange = (date) => { if (!selectedDates?.start || !selectedDates?.end) return false; const dateStr = date.toISOString().split('T')[0]; return dateStr > selectedDates.start && dateStr < selectedDates.end; }; const handleDateClick = (date) => { if (isDateBooked(date)) return; onDateSelect?.(date); }; const renderDays = () => { const days = []; const totalDays = daysInMonth + firstDayOfMonth; for (let i = 0; i < totalDays; i++) { if (i < firstDayOfMonth) { days.push(
); } else { const dayNumber = i - firstDayOfMonth + 1; const date = new Date( currentMonth.getFullYear(), currentMonth.getMonth(), dayNumber ); const isBooked = isDateBooked(date); const isSelected = isDateSelected(date); const inRange = isInRange(date); const isToday = date.toDateString() === new Date().toDateString(); days.push( ); } } return days; }; return (
{/* رأس التقويم */}

{monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()}

{/* أيام الأسبوع */}
أحد
إثنين
ثلاثاء
أربعاء
خميس
جمعة
سبت
{renderDays()}
محجوز
محدد
ضمن الفترة
اليوم
); }; const BookingCard = ({ booking, onViewDetails, onContact }) => { const formatCurrency = (amount) => { return amount?.toLocaleString() + ' ل.س'; }; const getStatusBadge = (status) => { const statusConfig = { pending: { label: 'قيد الانتظار', color: 'bg-yellow-100 text-yellow-800', icon: Clock }, confirmed: { label: 'مؤكد', color: 'bg-green-100 text-green-800', icon: CheckCircle }, cancelled: { label: 'ملغي', color: 'bg-red-100 text-red-800', icon: XCircle }, completed: { label: 'منتهي', color: 'bg-gray-100 text-gray-800', icon: CheckCircle } }; const config = statusConfig[status] || statusConfig.pending; const Icon = config.icon; return ( {config.label} ); }; return (

{booking.propertyTitle}

{getStatusBadge(booking.status)}
{booking.location}
{formatCurrency(booking.totalAmount)}
إجمالي المبلغ

{booking.tenantName}

{booking.tenantPhone} {booking.tenantEmail}
من
{booking.startDate}
إلى
{booking.endDate}
المدة
{booking.days} يوم
{/* */}
); }; const BookingDetailsModal = ({ booking, isOpen, onClose }) => { if (!isOpen || !booking) return null; const formatCurrency = (amount) => { return amount?.toLocaleString() + ' ل.س'; }; return ( e.stopPropagation()} >

تفاصيل الحجز

رقم الحجز: #{booking.id}

معلومات العقار

العقار: {booking.propertyTitle}

الموقع: {booking.location}

{booking.propertyDetails && (
{booking.propertyDetails.bedrooms} غرف {booking.propertyDetails.bathrooms} حمامات {booking.propertyDetails.area} م²
)}

معلومات المستأجر

الاسم: {booking.tenantName}

البريد الإلكتروني: {booking.tenantEmail}

رقم الهاتف: {booking.tenantPhone}

تفاصيل الحجز

تاريخ البداية

{booking.startDate}

تاريخ النهاية

{booking.endDate}

عدد الأيام

{booking.days} يوم

حالة الحجز

{booking.status === 'pending' ? 'قيد الانتظار' : booking.status === 'confirmed' ? 'مؤكد' : booking.status === 'cancelled' ? 'ملغي' : 'منتهي'}

المعلومات المالية

السعر اليومي {formatCurrency(booking.dailyPrice)}
المدة ({booking.days} أيام) {formatCurrency(booking.dailyPrice * booking.days)}
سلفة الضمان {formatCurrency(booking.securityDeposit || 0)}
الإجمالي {formatCurrency(booking.totalAmount)}
{booking.notes && (

ملاحظات

{booking.notes}

)}
); }; export default function OwnerBookingsPage() { const router = useRouter(); const [user, setUser] = useState(null); const [bookings, setBookings] = useState([]); const [filteredBookings, setFilteredBookings] = useState([]); const [isLoading, setIsLoading] = useState(true); const [selectedBooking, setSelectedBooking] = useState(null); const [filterStatus, setFilterStatus] = useState('all'); const [searchTerm, setSearchTerm] = useState(''); const [dateRange, setDateRange] = useState({ start: '', end: '' }); const [showCalendar, setShowCalendar] = useState(false); useEffect(() => { const authUser = AuthService.getUser(); if (authUser && AuthService.isOwner()) { setUser({ name: authUser.name || authUser.email, email: authUser.email, role: 'owner', }); loadBookings(); } else { router.push('/auth/choose-role'); } }, [router]); const loadBookings = () => { const storedBookings = localStorage.getItem('ownerBookings'); if (storedBookings) { setBookings(JSON.parse(storedBookings)); setFilteredBookings(JSON.parse(storedBookings)); } else { const mockBookings = [ { id: 'BK001', propertyId: 1, propertyTitle: 'فيلا فاخرة في المزة', location: 'دمشق، المزة', propertyDetails: { bedrooms: 5, bathrooms: 4, area: 450 }, tenantName: 'أحمد محمد', tenantEmail: 'ahmed@example.com', tenantPhone: '0933111222', startDate: '2024-03-10', endDate: '2024-03-15', days: 5, dailyPrice: 500000, totalAmount: 2500000, securityDeposit: 500000, status: 'confirmed', createdAt: '2024-02-25', notes: 'طلب الحجز من خلال الموقع' }, { id: 'BK002', propertyId: 2, propertyTitle: 'شقة حديثة في الشهباء', location: 'حلب، الشهباء', propertyDetails: { bedrooms: 3, bathrooms: 2, area: 180 }, tenantName: 'سارة أحمد', tenantEmail: 'sara@example.com', tenantPhone: '0945123789', startDate: '2024-03-05', endDate: '2024-03-08', days: 3, dailyPrice: 250000, totalAmount: 750000, securityDeposit: 250000, status: 'pending', createdAt: '2024-02-24', notes: 'تحتاج إلى تأكيد' }, { id: 'BK003', propertyId: 3, propertyTitle: 'بيت عائلي في بابا عمرو', location: 'حمص، بابا عمرو', propertyDetails: { bedrooms: 4, bathrooms: 3, area: 300 }, tenantName: 'محمد الحلبي', tenantEmail: 'mohammed@example.com', tenantPhone: '0956123456', startDate: '2024-02-20', endDate: '2024-03-20', days: 30, dailyPrice: 350000, totalAmount: 10500000, securityDeposit: 500000, status: 'completed', createdAt: '2024-02-15', notes: 'تم إنهاء الإيجار بنجاح' } ]; setBookings(mockBookings); setFilteredBookings(mockBookings); localStorage.setItem('ownerBookings', JSON.stringify(mockBookings)); } setIsLoading(false); }; const handleViewDetails = (booking) => { setSelectedBooking(booking); }; const handleContact = (booking) => { toast.success(`جاري فتح محادثة مع ${booking.tenantName}`, { icon: '💬', style: { background: '#dcfce7', color: '#166534' } }); }; const handleStatusChange = (bookingId, newStatus) => { const updatedBookings = bookings.map(b => b.id === bookingId ? { ...b, status: newStatus } : b ); setBookings(updatedBookings); setFilteredBookings(updatedBookings); localStorage.setItem('ownerBookings', JSON.stringify(updatedBookings)); toast.success(`تم تحديث حالة الحجز بنجاح`); }; const statusCounts = { all: bookings.length, pending: bookings.filter(b => b.status === 'pending').length, confirmed: bookings.filter(b => b.status === 'confirmed').length, completed: bookings.filter(b => b.status === 'completed').length, cancelled: bookings.filter(b => b.status === 'cancelled').length }; if (isLoading) { return (

جاري تحميل الحجوزات...

); } return (
setSelectedBooking(null)} />

حجوزاتي

مرحباً {user?.name}، لديك {bookings.length} حجز

{/* */}
setFilterStatus('all')} >
{statusCounts.all}
جميع الحجوزات
setFilterStatus('pending')} >
{statusCounts.pending}
قيد الانتظار
setFilterStatus('confirmed')} >
{statusCounts.confirmed}
مؤكدة
setFilterStatus('completed')} >
{statusCounts.completed}
منتهية
setFilterStatus('cancelled')} >
{statusCounts.cancelled}
ملغية
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500" />
setDateRange({...dateRange, start: e.target.value})} className="px-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500" placeholder="من تاريخ" /> setDateRange({...dateRange, end: e.target.value})} className="px-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500" placeholder="إلى تاريخ" /> {(dateRange.start || dateRange.end) && ( )}
{showCalendar && ( console.log('Date selected:', date)} /> )} {filteredBookings.length === 0 ? (

لا توجد حجوزات

{filterStatus !== 'all' ? 'لا توجد حجوزات في هذه الفئة' : 'لم يتم استلام أي حجوزات بعد'}

{filterStatus !== 'all' && ( )}
) : (
{filteredBookings.map((booking) => ( ))}
)}
); }