# Photo Management System

## Overview
The Photo Management System allows users to upload, organize, and display photos for parks in the ThrillWiki application. This document outlines the implementation details, architecture, and key components of the system.

## Components

### Models
- **Photo Model**: Polymorphic model that can be associated with any entity (currently used with Parks)
  - Attributes: title, description, file_path, file_name, file_size, mime_type, width, height, position, is_featured, alt_text, credit, source_url, metadata
  - Relationships: morphTo photoable (currently Park)
  - Methods: setAsFeatured, updatePosition, getUrlAttribute, getThumbnailUrlAttribute

### Controllers
- **PhotoController**: Handles CRUD operations for photos
  - Methods: index, store, show, update, destroy
  - Responsibilities: File upload handling, validation, thumbnail generation

### Livewire Components
- **PhotoUploadComponent**: Handles photo upload UI and processing
- **PhotoGalleryComponent**: Displays photos in a gallery format
- **PhotoManagerComponent**: Allows reordering and deleting photos
- **FeaturedPhotoSelectorComponent**: UI for selecting featured photos

### API Endpoints
- RESTful endpoints for photo management
- Endpoints for reordering photos
- Endpoint for setting featured photos

### Storage Configuration
- Public disk for storing photos
- Directory structure: storage/app/public/photos/{entity_type}/{entity_id}/
- Thumbnail generation and optimization
- File naming convention: {timestamp}_{original_filename}

## Implementation Status

### Completed
- Photo model and database migration
- Relationships with Park model
- Methods for adding, featuring, and reordering photos

### Completed
- Photo model and database migration
- Relationships with Park model
- Methods for adding, featuring, and reordering photos
- PhotoController implementation with CRUD operations
- File upload handling and validation
- Thumbnail generation using Intervention Image
- Livewire components for photo management:
  - PhotoUploadComponent
  - PhotoGalleryComponent
  - PhotoManagerComponent
  - FeaturedPhotoSelectorComponent
- Park detail page photo display
- API endpoints for photo management
- Storage configuration and symbolic link

### Pending
- Testing
- Documentation updates
- Performance optimization

## Technical Decisions

### File Storage
- Using Laravel's public disk for storing photos
- Files accessible via /storage/photos/...
- Thumbnails generated at upload time
- Original files preserved

### Image Processing
- Using Intervention Image for thumbnail generation
- Thumbnails created at 300x300px (maintaining aspect ratio)
- Original images preserved
- JPEG compression for web optimization

### Security Considerations
- Strict file type validation
- File size limits (10MB max)
- Proper authorization checks
- Sanitized filenames

## Usage Examples

### Adding a Photo to a Park
```php
$park->addPhoto([
    'title' => 'Park Entrance',
    'description' => 'Main entrance to the park',
    'file_path' => 'photos/parks/123/entrance.jpg',
    'file_name' => 'entrance.jpg',
    'is_featured' => true
]);
```

### Setting a Featured Photo
```php
$park->setFeaturedPhoto($photoId);
```

### Reordering Photos
```php
$park->reorderPhotos([3, 1, 4, 2]); // Array of photo IDs in desired order
```

## Future Enhancements
- Support for additional entity types (rides, attractions)
- Advanced image editing capabilities
- Bulk upload functionality
- Image tagging and categorization
- EXIF data extraction and display