import { Staff, Media } from '@/types'; import { useNavigate } from 'react-router-dom'; import { motion, AnimatePresence } from 'motion/react'; import { ArrowLeft, Calendar, MapPin, Briefcase, Film, User, Ruler, Palette, Eye, BookOpen, Theater, ArrowUpAZ, ArrowDownAZ, ArrowUpDown, Star } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, } from '@/components/ui/dropdown-menu'; import { Separator } from '@/components/ui/separator'; import { useState } from 'react'; import { cn } from '@/lib/utils'; interface CastDetailViewProps { person: Staff; relatedMedia: Media[]; } export default function CastDetailView({ person, relatedMedia }: CastDetailViewProps) { const navigate = useNavigate(); const [sortBy, setSortBy] = useState<'year' | 'title' | 'role'>('role'); const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc'); const handleMediaClick = (mediaId: string) => { navigate(`/media/${mediaId}`); }; const sortedFilmography = [...(person.filmography || [])].sort((a, b) => { let comparison = 0; if (sortBy === 'year') { comparison = (a.year || 0) - (b.year || 0); } else if (sortBy === 'title') { comparison = (a.title || '').localeCompare(b.title || ''); } else if (sortBy === 'role') { comparison = (a.role || '').localeCompare(b.role || ''); } return sortOrder === 'asc' ? comparison : -comparison; }); // Sort options const sortOptions = [ { value: 'year', label: 'Year', icon: Calendar }, { value: 'title', label: 'Title', icon: ArrowUpAZ }, { value: 'role', label: 'Role', icon: Briefcase }, ] as const; return (
{/* Compact Hero Section */}
{person.name}

{person.name}

{person.occupations?.map(occ => ( {occ} ))} {person.filmography && person.filmography.length > 0 && ( {person.filmography.length} )}
{/* Content Section */}
{/* Sidebar Info - Modern shadcn Design */}
{/* Personal Info Card */}
Personal Info
{/* Birth Date */}
Born
{person.birthDate || '—'}
{/* Birth Place */}
Origin
{person.birthPlace || '—'}
{/* Known For */}
Role
{person.role}
{/* Ethnicity - only if present */} {(person.ethnicity || person.adult_specifics?.ethnicity) && ( <>
Ethnicity
{person.adult_specifics?.ethnicity || person.ethnicity}
)}
{/* Measurements Card - Only if data exists */} {(person.adult_specifics?.height || person.height || person.adult_specifics?.weight || person.weight || person.adult_specifics?.measurements || person.bust_size || person.hair_color || person.adult_specifics?.hair_color) && (
Measurements
{/* Height & Weight Grid */} {(person.adult_specifics?.height || person.height || person.adult_specifics?.weight || person.weight) && ( <>
{(person.adult_specifics?.height || person.height) && (

Height

{person.adult_specifics?.height || person.height} cm

)} {(person.adult_specifics?.weight || person.weight) && (

Weight

{person.adult_specifics?.weight || person.weight} kg

)}
)} {/* Measurements (Bust-Waist-Hip) */} {(person.adult_specifics?.measurements || person.bust_size || person.cup_size || person.waist_size || person.hip_size) && ( <>

Figure

{person.adult_specifics?.measurements || ( <> {person.bust_size && {person.bust_size}{person.cup_size && {person.cup_size}}} {(person.bust_size || person.cup_size) && person.waist_size && } {person.waist_size && {person.waist_size}} {person.hip_size && } {person.hip_size && {person.hip_size}} )}

)} {/* Hair & Eyes Grid */}
{(person.hair_color || person.adult_specifics?.hair_color) && (
Hair

{person.adult_specifics?.hair_color || person.hair_color}

)} {(person.eye_color || person.adult_specifics?.eye_color) && (
Eyes

{person.adult_specifics?.eye_color || person.eye_color}

)}
{/* Tattoos & Piercings */} {(person.adult_specifics?.tattoos || person.adult_specifics?.piercings) && ( <>
{person.adult_specifics?.tattoos && (

Tattoos

{person.adult_specifics.tattoos}

)} {person.adult_specifics?.piercings && (

Piercings

{person.adult_specifics.piercings}

)}
)}
)}
{/* Main Bio & Roles - Wider */}
{person.bio && ( Biography )} {person.filmography && person.filmography.length > 0 && ( <> Characters Filmography )} {person.bio && ( Biography

{person.bio}

)} {person.filmography && person.filmography.length > 0 && ( <>
{person.filmography.map((item, index) => ( handleMediaClick(item.id.toString())} >
{item.title}

Character

{item.characterName || item.role}

{item.title}

))}
{/* Sort Toolbar */}

{person.filmography.length} {person.filmography.length === 1 ? 'title' : 'titles'}

Sort by {sortOptions.map(option => ( { if (sortBy === option.value) { setSortOrder(prev => prev === 'asc' ? 'desc' : 'asc'); } else { setSortBy(option.value); setSortOrder('asc'); } }} className="flex items-center justify-between text-xs" > {option.label} {sortBy === option.value && ( sortOrder === 'asc' ? : )} ))}
{/* Filmography Grid */}
{sortedFilmography.map((item, index) => ( handleMediaClick(item.id.toString())} className="group cursor-pointer hover:border-[#6d28d9]/30 hover:shadow-md transition-all duration-200 border-border/60" >
{item.title}

{item.title}

{item.year || 'Unknown'}

{item.role} {item.category && ( {item.category} )}
))}
)}
); }