# Banner and Advertising System - Complete Documentation

## Overview
The banner and advertising system provides a comprehensive solution for managing advertising spaces across the website. The system features automatic placement recommendations based on image resolution, preset dimensions for optimal display, and automatic sponsor integration.

## Key Features

### 1. **Preset-Based Banner Placements**
The system includes 5 predefined banner placements with optimal dimensions:

| Placement | Dimensions | Aspect Ratio | Position | Description |
|-----------|------------|--------------|----------|-------------|
| `homepage_top` | 1200 × 200 | 6:1 | Top | Main banner at the top of homepage, shown to all visitors |
| `homepage_middle` | 970 × 250 | 3.88:1 | Middle | Banner in the middle of the page between content |
| `homepage_sidebar` | 300 × 250 | 1.2:1 | Sidebar | Smaller banner in the right sidebar panel |
| `homepage_footer` | 1200 × 200 | 6:1 | Footer | Banner at the bottom of the page before footer |
| `article_inline` | 728 × 90 | 8.09:1 | Article | Banner displayed within article text |

### 2. **Automatic Image Resolution Detection**
When uploading a banner image:
- The system automatically detects the image resolution (width × height)
- Calculates the aspect ratio
- Provides up to 3 recommended placements based on image dimensions
- Recommends the best matching placement (highlighted as "Nejlepší")
- Displays resolution info: "Rozlišení: 1200×200 px, Poměr stran: 6.00:1"

### 3. **Smart Placement Recommendations**
The recommendation algorithm:
1. Compares image aspect ratio with preset aspect ratios
2. Evaluates width and height differences
3. Scores each placement (lower score = better match)
4. Returns top 3 recommendations ranked by quality
5. Auto-selects the best match if no placement is already chosen

### 4. **Live Preview System**
- Shows banner preview in the admin modal
- Preview respects the selected placement dimensions
- Displays where the banner will appear: "Zobrazení v pozici: [Placement Label]"
- Scaled proportionally to fit admin interface (max 600px width)

### 5. **Placement Information Display**
For each placement, the system shows:
- **Label**: User-friendly Czech name
- **Description**: Detailed explanation of where and how it displays
- **Dimensions**: Exact pixel dimensions (read-only, automatically set)
- **Aspect Ratio**: Calculated ratio for reference
- **Position**: Logical position identifier (top, middle, sidebar, footer, article)

### 6. **Manual Dimension Removal**
- Width and height fields are **removed** from manual input
- Dimensions are **automatically set** based on selected placement preset
- This ensures consistency and prevents display issues
- Users can only select from predefined placements

### 7. **Automatic Sponsor Integration**
When a banner is created/updated:
- The banner data is stored in the `sponsors` table with placement metadata
- Active banners (`is_active = true`) automatically appear in:
  - **Footer**: Displayed in "Naši partneři" section with inverted logo styling
  - **Sponsors Page**: Listed alongside regular sponsors
  - **Homepage Sponsors Section**: Included in the sponsors grid/slider
- Provides dual functionality: advertising + partnership visibility

### 8. **Enhanced Admin Interface**
The Banners Admin Page (`/admin/bannery`) includes:
- **Table View** with columns:
  - Náhled (Preview thumbnail)
  - Název (Name) + URL preview
  - Umístění (Placement label + position badge)
  - Rozměry (Dimensions display)
  - Aktivní (Active status badge)
  - Akce (Edit/Delete actions)
- **Modal Editor** with:
  - Name input
  - Click-through URL (optional)
  - Image upload with progress indicator
  - Resolution detection alert
  - Placement recommendations panel
  - Placement selector with descriptions
  - Dimension display (read-only)
  - Live preview area
  - Active toggle switch

## Technical Implementation

### Database Schema
Banners use the existing `sponsors` table with additional fields:
```sql
CREATE TABLE sponsors (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  logo_url TEXT,
  website_url TEXT,
  is_active BOOLEAN DEFAULT true,
  tier TEXT DEFAULT 'standard',
  display_order INTEGER DEFAULT 0,
  placement TEXT,  -- e.g., 'homepage_top'
  width INTEGER,   -- e.g., 1200
  height INTEGER,  -- e.g., 200
  created_at TIMESTAMP,
  updated_at TIMESTAMP
);
```

### Frontend Components

#### 1. **BannersAdminPage.tsx**
Location: `frontend/src/pages/admin/BannersAdminPage.tsx`

Key Functions:
- `getPreset(placement)` - Retrieves preset configuration by placement value
- `recommendPlacement(width, height)` - Returns top 3 recommended placements
- `onUpload(file)` - Handles image upload with resolution detection
- `openCreate()` - Opens modal with default placement preset
- `openEdit(sponsor)` - Opens modal for editing existing banner

State Management:
- `editing` - Current banner being edited
- `imageResolution` - Detected image dimensions
- `recommendedPlacements` - Array of recommended placements
- `uploadingImage` - Upload progress indicator

#### 2. **BannerDisplay.tsx**
Location: `frontend/src/components/banners/BannerDisplay.tsx`

Props:
```typescript
interface BannerDisplayProps {
  banners: Banner[];
  placement: 'homepage_top' | 'homepage_middle' | 'homepage_sidebar' | 'homepage_footer' | 'article_inline';
  containerStyle?: React.CSSProperties;
}
```

Features:
- Filters active banners for specific placement
- Applies placement-specific styling
- Handles responsive layout
- Provides hover effects
- Lazy loads images

#### 3. **Footer.tsx**
Location: `frontend/src/components/layout/Footer.tsx`

Sponsor Display:
- Fetches sponsors from `/api/v1/public/sponsors`
- Filters active sponsors (`is_active !== false`)
- Displays in responsive grid (2-6 columns)
- Inverted logos for dark background
- Links to sponsor websites with tracking

### Backend Integration

#### API Endpoints
```
GET    /api/v1/public/sponsors        - List all active sponsors/banners
POST   /api/v1/sponsors                - Create new banner (admin)
PUT    /api/v1/sponsors/:id            - Update banner (admin)
DELETE /api/v1/sponsors/:id            - Delete banner (admin)
```

#### Sponsor Model (Go)
```go
type Sponsor struct {
    gorm.Model
    Name         string `gorm:"not null" json:"name"`
    LogoURL      string `json:"logo_url"`
    WebsiteURL   string `json:"website_url"`
    Description  string `json:"description"`
    IsActive     bool   `gorm:"default:true" json:"is_active"`
    Tier         string `gorm:"default:'standard'" json:"tier"`
    DisplayOrder int    `gorm:"default:0" json:"display_order"`
    Placement    string `json:"placement"`
    Width        int    `json:"width"`
    Height       int    `json:"height"`
}
```

### Display Locations

#### Homepage
Banners are displayed in the following locations on the homepage:

1. **Top Banner** (`homepage_top`)
   - Full-width section after header
   - Light gray background with borders
   - Centered content

2. **Middle Banner** (`homepage_middle`)
   - Between content sections
   - Centered display
   - Standard margin spacing

3. **Sidebar Banner** (`homepage_sidebar`)
   - Right sidebar (desktop)
   - Sticky positioning (top: 96px)
   - Stacked on mobile
   - Rounded corners with shadow

4. **Footer Banner** (`homepage_footer`)
   - Above footer navigation
   - Full-width with background
   - Centered content

#### Article Pages
5. **Inline Banner** (`article_inline`)
   - Embedded within article content
   - Standard ad format (728×90)
   - Responsive on mobile

#### Footer
All active banners (regardless of placement) also appear as sponsors in:
- Footer "Naši partneři" section
- 6-column responsive grid
- White inverted logos on dark background

#### Sponsors Page
Banners are included in the sponsors page listing at `/sponzori`.

## Usage Guide

### Adding a New Banner

1. **Navigate to Admin Panel**
   - Go to `/admin/bannery`
   - Click "Nový banner" button

2. **Upload Image**
   - Click "Nahrát obrázek" button
   - Select your banner image file
   - System automatically detects resolution

3. **Review Recommendations**
   - Check the detected resolution alert
   - Review recommended placements (up to 3)
   - Best match is highlighted in green

4. **Select Placement**
   - Choose from dropdown or click "Použít" on recommendation
   - View placement description below selector
   - See dimensions display (auto-set, read-only)

5. **Preview Banner**
   - Check live preview in modal
   - Verify it matches expected dimensions
   - See placement label below preview

6. **Configure Details**
   - Enter banner name (required)
   - Add website URL for click-through (optional)
   - Toggle active status (default: active)

7. **Save**
   - Click "Uložit" button
   - Banner appears immediately on site
   - Also added to sponsors in footer

### Editing an Existing Banner

1. Click edit icon (pencil) in banner table
2. Modify any fields except dimensions
3. Upload new image to change resolution/placement
4. Save changes

### Best Practices

#### Image Preparation
- **Use correct dimensions** for target placement
- **High quality images** (at least 2x for retina displays)
- **Optimize file size** (recommended: <500KB)
- **Use PNG or JPG** formats
- **Test on mobile** - ensure text is readable

#### Recommended Image Sizes
For best quality on retina displays:
- `homepage_top`: 2400×400 @ 72dpi
- `homepage_middle`: 1940×500 @ 72dpi
- `homepage_sidebar`: 600×500 @ 72dpi
- `homepage_footer`: 2400×400 @ 72dpi
- `article_inline`: 1456×180 @ 72dpi

#### Naming Convention
Use descriptive names:
- ❌ Bad: "Banner 1", "IMG_1234"
- ✅ Good: "Hlavní partner 2025", "Turnaj léto 2025"

#### URL Configuration
- Always use `https://` protocol
- Test link before saving
- Use tracking parameters if needed: `?utm_source=banner&utm_medium=homepage`

#### Active Status
- Set to active only when campaign is live
- Deactivate expired campaigns instead of deleting
- Keeps historical data and analytics

## Troubleshooting

### Issue: Banner not displaying
**Solutions:**
1. Check `is_active` status is `true`
2. Verify placement matches homepage style
3. Clear browser cache
4. Check image URL is accessible

### Issue: Wrong placement recommendations
**Cause:** Image aspect ratio doesn't match any preset closely

**Solutions:**
1. Resize image to match recommended dimensions
2. Choose closest preset manually
3. Accept that banner may not perfectly fit

### Issue: Image resolution not detected
**Cause:** Browser security/CORS issues

**Solutions:**
1. Upload image again
2. Try different image format
3. Check image file integrity
4. Use supported format (JPG/PNG/WebP)

### Issue: Banner overlaps content
**Cause:** Custom styling conflicts

**Solutions:**
1. Use preset placements only
2. Don't modify width/height manually
3. Check responsive behavior on mobile

### Issue: Sponsor not showing in footer
**Cause:** Banner not marked as active or API error

**Solutions:**
1. Verify `is_active = true`
2. Check API endpoint `/api/v1/public/sponsors`
3. Refresh page to reload sponsors
4. Check browser console for errors

## Future Enhancements

Potential improvements:
- [ ] A/B testing for banner effectiveness
- [ ] Click-through tracking and analytics
- [ ] Impression counting
- [ ] Scheduled banner campaigns (start/end dates)
- [ ] Banner rotation for same placement
- [ ] Custom placement creation
- [ ] Banner templates library
- [ ] Bulk upload functionality
- [ ] Performance metrics dashboard

## Technical Notes

### Performance Considerations
- Images use `loading="lazy"` for off-screen banners
- Responsive images with `object-fit: contain`
- Minimal re-renders with React state management
- Cached sponsor data in footer

### Accessibility
- All banners have descriptive `alt` text
- Clickable areas use semantic `<a>` tags
- Keyboard navigation support
- ARIA labels where appropriate

### Security
- Image uploads validate file types
- URLs sanitized before storage
- External links use `rel="noopener noreferrer"`
- XSS protection on user inputs

## Support

For issues or questions about the banner system:
1. Check this documentation first
2. Review browser console for errors
3. Test with different image formats
4. Contact system administrator

---

**Last Updated:** 2025-01-12
**Version:** 1.0
**Maintained by:** MyClub Development Team
