import React, { useState } from 'react';
import { Head, Link, router } from '@inertiajs/react';
import EmployerLayout from '../../../Layouts/EmployerLayout';
import { useTranslation } from '../../../lib/LanguageContext';
import {
CheckCircle2,
Globe2,
Briefcase,
DollarSign,
Calendar,
HeartHandshake,
Languages,
MessageSquare,
Bookmark,
ArrowLeft,
Sparkles,
FileText,
ShieldCheck,
Search,
Star,
Share2,
Flag,
X,
UserCheck,
AlertTriangle,
User,
Phone,
MapPin,
Clock
} from 'lucide-react';
import { toast } from 'sonner';
const getLanguageFlag = (lang) => {
const flags = {
'English': '🇬🇧',
'Arabic': '🇦🇪',
'Tagalog': '🇵🇭',
'Hindi': '🇮🇳',
'Swahili': '🇰🇪',
'French': '🇫🇷',
'Indonesian': '🇮🇩'
};
return flags[lang] || '🌐';
};
const getExpiryStatus = (expiryDate) => {
if (!expiryDate) return { text: 'Expiry Pending', color: 'text-slate-500 bg-slate-50 border-slate-200' };
const expiry = new Date(expiryDate);
const today = new Date();
expiry.setHours(0,0,0,0);
today.setHours(0,0,0,0);
const diffTime = expiry.getTime() - today.getTime();
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
if (diffDays < 0) {
return {
text: 'Expired',
color: 'text-rose-700 bg-rose-50 border-rose-200 font-black'
};
} else if (diffDays === 0) {
return {
text: 'Expires today',
color: 'text-amber-700 bg-amber-50 border-amber-200 font-black'
};
} else {
return {
text: `Valid until ${expiryDate}`,
color: 'text-emerald-700 bg-emerald-50 border-emerald-150 font-black'
};
}
};
const safeRender = (value, fallback = 'Not Extracted') => {
if (value === null || value === undefined || String(value).trim() === '') return fallback;
if (typeof value === 'object') {
if (value.name) return String(value.name);
if (value.full_name) return String(value.full_name);
return JSON.stringify(value);
}
return String(value);
};
export default function Show({ worker }) {
const { t } = useTranslation();
const passportDoc = worker.documents?.find(d => d.type === 'passport');
const emiratesIdDoc = worker.documents?.find(d => d.type === 'emirates_id' || d.type === 'eid');
const visaDoc = worker.documents?.find(d => d.type === 'visa');
// Robust passport document fallbacks
const passportOcr = passportDoc?.ocr_data || {};
const passportGivenNames = passportOcr.given_names || worker.name || 'Not Extracted';
const passportSurname = passportOcr.surname || '';
const passportNumber = passportOcr.passport_number || passportDoc?.number || 'Not Extracted';
const passportSex = passportOcr.sex || worker.gender || 'Not Extracted';
const passportDob = passportOcr.date_of_birth || (worker.age ? `Age ${worker.age}` : 'Not Extracted');
const passportPlaceOfBirth = passportOcr.place_of_birth || 'Not Extracted';
const passportNationality = passportOcr.nationality || worker.nationality || 'Not Extracted';
const passportIssuingCountry = passportOcr.issuing_country || 'Not Extracted';
const passportIssueDate = passportOcr.date_of_issue || passportDoc?.issue_date || 'Not Extracted';
const passportExpiryDate = passportOcr.date_of_expiry || passportDoc?.expiry_date || 'Not Extracted';
const passportAuthority = passportOcr.authority || 'Not Extracted';
const passportDocType = passportOcr.document_type || passportDoc?.type || 'Passport';
// Robust visa document fallbacks
const visaOcr = visaDoc?.ocr_data || {};
const sponsorObj = visaOcr.sponsor;
const isSponsorObj = sponsorObj && typeof sponsorObj === 'object' && !Array.isArray(sponsorObj);
const sponsorName = isSponsorObj
? (sponsorObj.name || sponsorObj.sponsor_name)
: (visaOcr.sponsor_name || (typeof sponsorObj === 'string' ? sponsorObj : ''));
const sponsorPhone = isSponsorObj
? (sponsorObj.phone || sponsorObj.mobile || sponsorObj.mobile_number)
: '';
const sponsorAddress = isSponsorObj
? (sponsorObj.address || '')
: '';
const visaFullName = visaOcr.full_name || worker.name || 'Not Extracted';
const visaEntryPermitNo = visaOcr.entry_permit_no || visaDoc?.number || 'Not Extracted';
const visaUidNo = visaOcr.uid_no || 'Not Extracted';
const visaType = visaOcr.visa_type || worker.visa_status || 'Entry Permit';
const visaPassportNo = visaOcr.passport_no || visaOcr.passport_number || passportDoc?.number || 'Not Extracted';
const visaProfession = visaOcr.profession || worker.main_profession || 'Domestic Worker';
const visaSponsorName = sponsorName || visaOcr.sponsor_name || 'Not Extracted';
const visaSponsorPhone = sponsorPhone || 'Not Extracted';
const visaSponsorAddress = sponsorAddress || 'Not Extracted';
const visaNationality = visaOcr.nationality || worker.nationality || 'Not Extracted';
const visaCountry = visaOcr.country || 'United Arab Emirates';
const visaDob = visaOcr.date_of_birth || visaOcr.dob || 'Not Extracted';
const visaPlaceOfBirth = visaOcr.place_of_birth || 'Not Extracted';
const visaIssueDate = visaOcr.issue_date || visaDoc?.issue_date || 'Not Extracted';
const visaValidUntil = visaOcr.valid_until || visaOcr.expiry_date || visaDoc?.expiry_date || 'Not Extracted';
const visaDocType = visaOcr.document_type || visaDoc?.type || 'uae_visa';
const [showReportModal, setShowReportModal] = useState(false);
const [reportReason, setReportReason] = useState('');
const [reportDetails, setReportDetails] = useState('');
const [isShortlisted, setIsShortlisted] = useState(false);
// Hiring flow states
const [availabilityStatus, setAvailabilityStatus] = useState(worker.availability_status);
const [showHiredModal, setShowHiredModal] = useState(false);
const [showHireConfirmModal, setShowHireConfirmModal] = useState(false);
// Reviews state
const [showReviewModal, setShowReviewModal] = useState(false);
const [newRating, setNewRating] = useState(5);
const [newComment, setNewComment] = useState('');
const [workerReviews, setWorkerReviews] = useState(worker.reviews || []);
const handleShare = () => {
navigator.clipboard.writeText(window.location.href);
toast.success(t('profile_link_copied', 'Profile link copied to clipboard!'), {
description: t('profile_link_copied_desc', 'You can now share this URL with your family or sponsor contacts.')
});
};
const handleReportSubmit = (e) => {
e.preventDefault();
if (!reportReason) {
toast.error(t('select_report_reason', 'Please select a reason for reporting.'));
return;
}
toast.success(t('report_submitted', 'Worker report submitted successfully'), {
description: t('report_submitted_desc', "Our admin compliance team will investigate this worker's credentials within 24 hours.")
});
setShowReportModal(false);
setReportReason('');
setReportDetails('');
};
const handleReviewSubmit = (e) => {
e.preventDefault();
if (!newComment.trim()) {
toast.error(t('add_comment', 'Please add a comment.'));
return;
}
const newReview = {
id: Date.now(),
employer_name: t('you_verified_sponsor', 'You (Verified Sponsor)'),
rating: newRating,
date: t('today', 'Today'),
comment: newComment,
};
setWorkerReviews([newReview, ...workerReviews]);
toast.success(t('review_posted', 'Review posted successfully!'), {
description: t('review_posted_desc', 'Your trust feedback is live and helps other sponsors hire securely.')
});
setShowReviewModal(false);
setNewComment('');
};
const handleToggleShortlist = () => {
setIsShortlisted(!isShortlisted);
router.post('/employer/shortlist/toggle', { worker_id: worker.id }, {
preserveScroll: true,
onSuccess: () => {
toast.success(isShortlisted ? t('removed_from_shortlist', 'Removed from Shortlist') : t('added_to_shortlist', 'Added to Shortlist'));
}
});
};
const handleMarkHired = () => {
router.post(`/employer/workers/${worker.id}/mark-hired`, {}, {
preserveScroll: true,
onSuccess: () => {
setAvailabilityStatus('Pending Confirmation');
setShowHiredModal(true);
toast.success(t('hire_request_sent', 'Hiring request sent successfully!'), {
description: t('hire_request_sent_desc', 'Awaiting worker confirmation of the hiring offer.')
});
}
});
};
return (
{t('passport_pending_desc', 'Candidate has not uploaded a passport document yet.')}
{t('visa_pending_desc', 'Candidate has not uploaded a visa document yet.')}
{t('reviews_posted_by_sponsors_desc', 'Ratings can only be posted by verified sponsors who completed verified direct hiring.')}
"{review.comment}"
{t('hired_under_sponsorship_pending_desc', 'Your hiring request has been sent to {name}. The worker must accept the offer to finalize the placement.').replace('{name}', worker.name)}
{t('hired_under_sponsorship_desc', '{name} is successfully marked as Hired under your sponsorship! This direct matching conforms exactly with Stage 4 of our UAE MOHRE zero-middlemen flow.').replace('{name}', worker.name)}
{t('help_community_post_review', "Help the UAE community hire safely by posting an anonymous review describing {name}'s childcare, cooking, driving, or domestic skills.").replace('{name}', worker.name)}