# internal/homepage

The homepage package provides the GoDoxy WebUI dashboard with support for categories, favorites, widgets, dynamic item configuration, and icon management.

## Overview

The homepage package implements the WebUI dashboard, managing homepage items, categories, sorting methods, and widget integration for monitoring container status and providing interactive features.

### Key Features

- Dynamic homepage item management
- Category-based organization (All, Favorites, Hidden, Others)
- Multiple sort methods (clicks, alphabetical, custom)
- Widget support for live data display
- Icon URL handling with favicon integration
- Item override configuration
- Click tracking and statistics

## Architecture

```mermaid
graph TD
    A[HomepageMap] --> B{Category Management}
    B --> C[All]
    B --> D[Favorites]
    B --> E[Hidden]
    B --> F[Others]

    G[Item] --> H[ItemConfig]
    H --> I[Widget Config]
    H --> J[Icon]
    H --> K[Category]

    L[Widgets] --> M[HTTP Widget]
    N[Sorting] --> O[Clicks]
    N --> P[Alphabetical]
    N --> Q[Custom]
```

## Core Types

### Homepage Structure

```go
type HomepageMap struct {
    ordered.Map[string, *Category]
}

type Homepage []*Category

type Category struct {
    Items []*Item
    Name  string
}

type Item struct {
    ItemConfig
    SortOrder    int
    FavSortOrder int
    AllSortOrder int
    Clicks       int
    Widgets      []Widget
    Alias        string
    Provider     string
    OriginURL    string
    ContainerID  string
}

type ItemConfig struct {
    Show           bool
    Name           string
    Icon           *IconURL
    Category       string
    Description    string
    URL            string
    Favorite       bool
    WidgetConfig   *widgets.Config
}
```

### Sort Methods

```go
const (
    SortMethodClicks       = "clicks"
    SortMethodAlphabetical = "alphabetical"
    SortMethodCustom       = "custom"
)
```

### Categories

```go
const (
    CategoryAll       = "All"
    CategoryFavorites = "Favorites"
    CategoryHidden    = "Hidden"
    CategoryOthers    = "Others"
)
```

## Public API

### Creation

```go
// NewHomepageMap creates a new homepage map with default categories.
func NewHomepageMap(total int) *HomepageMap
```

### Item Management

```go
// Add adds an item to appropriate categories.
func (c *HomepageMap) Add(item *Item)

// GetOverride returns the override configuration for an item.
func (cfg Item) GetOverride() Item
```

### Sorting

```go
// Sort sorts a category by the specified method.
func (c *Category) Sort(method SortMethod)
```

## Usage

### Creating a Homepage Map

```go
homepageMap := homepage.NewHomepageMap(100) // Reserve space for 100 items
```

### Adding Items

```go
item := &homepage.Item{
    Alias:       "my-app",
    Provider:    "docker",
    OriginURL:   "http://myapp.local",
    ItemConfig: homepage.ItemConfig{
        Name:        "My Application",
        Show:        true,
        Favorite:    true,
        Category:    "Docker",
        Description: "My Docker application",
    },
}

homepageMap.Add(item)
```

### Sorting Categories

```go
allCategory := homepageMap.Get(homepage.CategoryAll)
if allCategory != nil {
    allCategory.Sort(homepage.SortMethodClicks)
}
```

### Filtering by Category

```go
favorites := homepageMap.Get(homepage.CategoryFavorites)
for _, item := range favorites.Items {
    fmt.Printf("Favorite: %s\n", item.Name)
}
```

## Widgets

The homepage supports widgets for each item:

```go
type Widget struct {
    Label string
    Value string
}

type Config struct {
    // Widget configuration
}
```

### Widget Types

Widgets can display various types of information:

- **Status**: Container health status
- **Stats**: Usage statistics
- **Links**: Quick access links
- **Custom**: Provider-specific data

## Categories

### Default Categories

| Category  | Description              |
| --------- | ------------------------ |
| All       | Contains all items       |
| Favorites | User-favorited items     |
| Hidden    | Items with `Show: false` |
| Others    | Uncategorized items      |

### Custom Categories

Custom categories are created dynamically:

```go
// Adding to custom category
item := &homepage.Item{
    ItemConfig: homepage.ItemConfig{
        Name:     "App",
        Category: "Development",
    },
}
homepageMap.Add(item)
// "Development" category is auto-created
```

## Override Configuration

Items can have override configurations for customization:

```go
// GetOverride returns the effective configuration
func (cfg Item) GetOverride() Item {
    return overrideConfigInstance.GetOverride(cfg)
}
```

## Sorting Methods

### Clicks Sort

Sorts by click count (most clicked first):

```go
func (c *Category) sortByClicks() {
    slices.SortStableFunc(c.Items, func(a, b *Item) int {
        if a.Clicks > b.Clicks {
            return -1
        }
        if a.Clicks < b.Clicks {
            return 1
        }
        return strings.Compare(title(a.Name), title(b.Name))
    })
}
```

### Alphabetical Sort

Sorts alphabetically by name:

```go
func (c *Category) sortByAlphabetical() {
    slices.SortStableFunc(c.Items, func(a, b *Item) int {
        return strings.Compare(title(a.Name), title(b.Name))
    })
}
```

### Custom Sort

Sorts by predefined sort order:

```go
func (c *Category) sortByCustom() {
    // Uses SortOrder, FavSortOrder, AllSortOrder fields
}
```

## Data Flow

```mermaid
sequenceDiagram
    participant RouteProvider
    participant HomepageMap
    participant Category
    participant Widget

    RouteProvider->>HomepageMap: Add(Item)
    HomepageMap->>HomepageMap: Add to All
    HomepageMap->>HomepageMap: Add to Category
    alt Item.Favorite
        HomepageMap->>CategoryFavorites: Add item
    else !Item.Show
        HomepageMap->>CategoryHidden: Add item
    end

    User->>HomepageMap: Get Category
    HomepageMap-->>User: Items

    User->>Category: Sort(method)
    Category-->>User: Sorted Items

    User->>Item: Get Widgets
    Item->>Widget: Fetch Data
    Widget-->>Item: Widget Data
    Item-->>User: Display Widgets
```

## Integration Points

The homepage package integrates with:

- **Route Provider**: Item discovery from routes
- **Container**: Container status and metadata
- **Widgets**: Live data display
- **API**: Frontend data API
- **Configuration**: Default and override configs

## Configuration

### Active Configuration

```go
var ActiveConfig atomic.Pointer[Config]
```

### Configuration Structure

```go
type Config struct {
    UseDefaultCategories bool
    // ... other options
}
```

## Serialization

The package registers default value factories for serialization:

```go
func init() {
    serialization.RegisterDefaultValueFactory(func() *ItemConfig {
        return &ItemConfig{
            Show: true,
        }
    })
}
```
