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.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 */}
{person.birthDate || '—'}
{/* Birth Place */}
{person.birthPlace || '—'}
{/* Known For */}
{/* Ethnicity - only if present */}
{(person.ethnicity || person.adult_specifics?.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) && (
{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())}
>
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.year || 'Unknown'}
{item.role}
{item.category && (
{item.category}
)}
))}
>
)}
);
}