import { useEffect, useState, useRef } from 'react'
import { useParams, Link, useNavigate } from 'react-router-dom'
import { Dog, GitBranch, Edit, Upload, Trash2, ArrowLeft, Calendar, Hash, Award } from 'lucide-react'
import axios from 'axios'
import DogForm from '../components/DogForm'
function DogDetail() {
const { id } = useParams()
const navigate = useNavigate()
const [dog, setDog] = useState(null)
const [loading, setLoading] = useState(true)
const [showEditModal, setShowEditModal] = useState(false)
const [uploading, setUploading] = useState(false)
const [selectedPhoto, setSelectedPhoto] = useState(0)
const fileInputRef = useRef(null)
useEffect(() => {
fetchDog()
}, [id])
const fetchDog = async () => {
try {
const res = await axios.get(`/api/dogs/${id}`)
setDog(res.data)
setLoading(false)
} catch (error) {
console.error('Error fetching dog:', error)
setLoading(false)
}
}
const handlePhotoUpload = async (e) => {
const file = e.target.files[0]
if (!file) return
setUploading(true)
const formData = new FormData()
formData.append('photo', file)
try {
await axios.post(`/api/dogs/${id}/photos`, formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
fetchDog()
} catch (error) {
console.error('Error uploading photo:', error)
alert('Failed to upload photo')
} finally {
setUploading(false)
if (fileInputRef.current) fileInputRef.current.value = ''
}
}
const handleDeletePhoto = async (photoIndex) => {
if (!confirm('Delete this photo?')) return
try {
await axios.delete(`/api/dogs/${id}/photos/${photoIndex}`)
fetchDog()
if (selectedPhoto >= photoIndex && selectedPhoto > 0) {
setSelectedPhoto(selectedPhoto - 1)
}
} catch (error) {
console.error('Error deleting photo:', error)
alert('Failed to delete photo')
}
}
const calculateAge = (birthDate) => {
if (!birthDate) return null
const today = new Date()
const birth = new Date(birthDate)
let years = today.getFullYear() - birth.getFullYear()
let months = today.getMonth() - birth.getMonth()
if (months < 0) {
years--
months += 12
}
if (years === 0) return `${months} month${months !== 1 ? 's' : ''}`
if (months === 0) return `${years} year${years !== 1 ? 's' : ''}`
return `${years}y ${months}m`
}
if (loading) {
return
Loading...
}
if (!dog) {
return Dog not found
}
return (
{/* Header */}
{dog.name}
{dog.breed}
•
{dog.sex === 'male' ? 'Male ♂' : 'Female ♀'}
{dog.birth_date && (
<>
•
{calculateAge(dog.birth_date)}
>
)}
Pedigree
{/* Photo Section - Compact */}
Photos
{dog.photo_urls && dog.photo_urls.length > 0 ? (
<>
{/* Main Photo */}
{/* Thumbnail Strip */}
{dog.photo_urls.length > 1 && (
{dog.photo_urls.map((url, index) => (

setSelectedPhoto(index)}
style={{
width: '60px',
height: '60px',
objectFit: 'cover',
borderRadius: 'var(--radius-sm)',
cursor: 'pointer',
border: selectedPhoto === index ? '2px solid var(--primary)' : '1px solid var(--border)',
opacity: selectedPhoto === index ? 1 : 0.6,
transition: 'all 0.2s'
}}
/>
))}
)}
>
) : (
)}
{/* Info Section */}
Details
Breed
{dog.breed}
Sex
{dog.sex === 'male' ? 'Male ♂' : 'Female ♀'}
{dog.birth_date && (
Birth Date
{new Date(dog.birth_date).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
({calculateAge(dog.birth_date)})
)}
{dog.color && (
Color
{dog.color}
)}
{dog.registration_number && (
Registration
{dog.registration_number}
)}
{dog.microchip && (
Microchip
{dog.microchip}
)}
{/* Parents */}
Pedigree
Sire
{dog.sire ? (
{dog.sire.name}
) : (
Unknown
)}
Dam
{dog.dam ? (
{dog.dam.name}
) : (
Unknown
)}
{/* Notes */}
{dog.notes && (
)}
{/* Offspring */}
{dog.offspring && dog.offspring.length > 0 && (
Offspring ({dog.offspring.length})
{dog.offspring.map(child => (
{
e.currentTarget.style.borderColor = 'var(--primary)'
e.currentTarget.style.background = 'var(--bg-tertiary)'
}}
onMouseLeave={(e) => {
e.currentTarget.style.borderColor = 'var(--border)'
e.currentTarget.style.background = 'var(--bg-primary)'
}}
>
{child.name}
{child.sex === 'male' ? '♂' : '♀'}
))}
)}
{showEditModal && (
setShowEditModal(false)}
onSave={() => {
fetchDog()
setShowEditModal(false)
}}
/>
)}
)
}
export default DogDetail