import { Metadata } from "next" import { notFound } from "next/navigation" import { Card, CardContent } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Separator } from "@/components/ui/separator" import Link from "next/link" import { Music, Calendar, MapPin, Users, ExternalLink, Globe, Instagram } from "lucide-react" interface MusicianPageProps { params: { slug: string } } async function getMusician(slug: string) { const res = await fetch(`${process.env.INTERNAL_API_URL}/musicians/${slug}`, { next: { revalidate: 60 }, }) if (!res.ok) { if (res.status === 404) return null throw new Error("Failed to fetch musician") } return res.json() } export async function generateMetadata({ params }: MusicianPageProps): Promise { const data = await getMusician(params.slug) if (!data) return { title: "Musician Not Found" } return { title: `${data.musician.name} | Fediversion`, description: data.musician.bio || `Musician profile for ${data.musician.name} on Fediversion.`, } } export default async function MusicianPage({ params }: MusicianPageProps) { const data = await getMusician(params.slug) if (!data) return notFound() const { musician, bands, guest_appearances, sit_in_summary, stats } = data return (
{/* Header */}
{musician.image_url ? ( {musician.name} ) : (
{musician.name[0]}
)}

{musician.name}

{musician.primary_instrument && (

{musician.primary_instrument}

)}
{musician.bio && (

{musician.bio}

)} {/* External Links */}
{musician.website_url && ( Website )} {musician.instagram_url && ( Instagram )} {musician.wikipedia_url && ( Wikipedia )}
{/* Stats */}
{stats?.total_bands || 0}
Bands
{stats?.current_bands || 0}
Current
{stats?.total_sit_ins || 0}
Sit-Ins
{stats?.bands_sat_in_with || 0}
Bands Sat In With
{/* Band History */} {bands && bands.length > 0 && ( <>

Band History

{bands.map((band: any, i: number) => (
{band.artist_name} {band.is_current && ( Current )}
{band.role}
{band.start_date?.split('-')[0] || '?'} {' - '} {band.is_current ? 'Present' : (band.end_date?.split('-')[0] || '?')}
))}
)} {/* Sit-In Summary */} {sit_in_summary && sit_in_summary.length > 0 && ( <>

Sit-In Summary

{sit_in_summary.map((band: any, i: number) => (
{band.vertical_name}
{band.count}
sit-in{band.count !== 1 ? 's' : ''}
))}
)} {/* Recent Guest Appearances */} {guest_appearances && guest_appearances.length > 0 && ( <>

Recent Guest Appearances

{guest_appearances.slice(0, 20).map((appearance: any, i: number) => (
{appearance.vertical_name} {appearance.show_date}
{appearance.instrument && (

Playing: {appearance.instrument}

)}
Sat in on: {appearance.song_title}
))}
{guest_appearances.length > 20 && (

Showing 20 of {guest_appearances.length} appearances

)} )}
) }