// models/gallery.go
package models

import (
	"time"
	
	"gorm.io/gorm"
)

type GalleryCategory string

const (
	GalleryCategoryTraining GalleryCategory = "training"
	GalleryCategoryEvents   GalleryCategory = "events"
	GalleryCategoryCommunity GalleryCategory = "community"
	GalleryCategoryAchievements GalleryCategory = "achievements"
)

type Gallery struct {
	ID          uint           `json:"id" gorm:"primaryKey"`
	Title       string         `json:"title" gorm:"size:255;not null"`
	Description string         `json:"description" gorm:"type:text"`
	ImagePath   string         `json:"image_path" gorm:"size:500;not null"` // Путь к изображению
	Category    GalleryCategory `json:"category" gorm:"type:varchar(20);not null"`
	AuthorID    uint           `json:"author_id" gorm:"not null;index"`
	EventDate   *time.Time     `json:"event_date"` // Дата события на фото
	Views       int            `json:"views" gorm:"default:0"`
	Likes       int            `json:"likes" gorm:"default:0"`
	CreatedAt   time.Time      `json:"created_at"`
	UpdatedAt   time.Time      `json:"updated_at"`

	// Связи
	Author User `json:"author,omitempty" gorm:"foreignKey:AuthorID"`
}

// BeforeCreate hook
func (g *Gallery) BeforeCreate(tx *gorm.DB) error {
	if g.CreatedAt.IsZero() {
		g.CreatedAt = time.Now()
	}
	if g.UpdatedAt.IsZero() {
		g.UpdatedAt = time.Now()
	}
	return nil
}

// BeforeUpdate hook
func (g *Gallery) BeforeUpdate(tx *gorm.DB) error {
	g.UpdatedAt = time.Now()
	return nil
}

// DTO для создания записи в галерее
type GalleryCreateRequest struct {
	Title       string         `json:"title" validate:"required,min=5,max=255"`
	Description string         `json:"description" validate:"max=1000"`
	ImagePath   string         `json:"image_path" validate:"required,max=500"`
	Category    GalleryCategory `json:"category" validate:"required,oneof=training events community achievements"`
	EventDate   *time.Time     `json:"event_date"`
}

// DTO для ответа с галереей
type GalleryResponse struct {
	ID          uint           `json:"id"`
	Title       string         `json:"title"`
	Description string         `json:"description"`
	ImagePath   string         `json:"image_path"`
	Category    GalleryCategory `json:"category"`
	EventDate   *time.Time     `json:"event_date"`
	Views       int            `json:"views"`
	Likes       int            `json:"likes"`
	CreatedAt   time.Time      `json:"created_at"`
	Author      AuthorInfo     `json:"author"`
}