package models

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

type ObjectType string

const (
	ObjectTypeHotel      ObjectType = "hotel"
	ObjectTypeSanatorium ObjectType = "sanatorium"
	ObjectTypeGuestHouse ObjectType = "guest_house"
	ObjectTypeTour       ObjectType = "tour"
	ObjectTypeRestaurant ObjectType = "restaurant"
	ObjectTypeMuseum     ObjectType = "museum"
	ObjectTypeLandmark   ObjectType = "landmark"
	ObjectTypeEvent      ObjectType = "event"
	ObjectTypeRoute      ObjectType = "route"
)

type ObjectStatus string

const (
	ObjectStatusDraft      ObjectStatus = "draft"
	ObjectStatusModeration ObjectStatus = "moderation"
	ObjectStatusActive     ObjectStatus = "active"
	ObjectStatusInactive   ObjectStatus = "inactive"
	ObjectStatusRejected   ObjectStatus = "rejected"
)

type Object struct {
	ID        uint           `gorm:"primaryKey" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	// Основная информация
	Title       string     `gorm:"not null" json:"title"`
	Type        ObjectType `gorm:"not null" json:"type"`
	Description string     `gorm:"type:text" json:"description"`

	// Локация
	City      string  `gorm:"not null" json:"city"`
	Address   string  `json:"address"`
	Latitude  float64 `json:"latitude"`
	Longitude float64 `json:"longitude"`

	// Цена и условия
	Price       float64 `gorm:"default:0" json:"price"`
	PricePeriod string  `gorm:"default:'per_night'" json:"price_period"` // per_night, per_person, per_tour

	// Статус и рейтинг
	Status      ObjectStatus `gorm:"default:draft" json:"status"`
	Rating      float64      `gorm:"default:0" json:"rating"`
	ReviewCount int          `gorm:"default:0" json:"review_count"`
	ViewCount   int          `gorm:"default:0" json:"view_count"`

	// Владелец
	OwnerID uint `gorm:"not null;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"owner_id"`
	Owner   User `gorm:"foreignKey:OwnerID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"owner,omitempty"`

	// Связи
	Images    []ObjectImage `gorm:"foreignKey:ObjectID" json:"images"`
	Amenities []Amenity     `gorm:"many2many:object_amenities;" json:"amenities"`
	Reviews   []Review      `gorm:"foreignKey:ObjectID" json:"-"`
}

// ObjectImage представляет изображения объекта
type ObjectImage struct {
	ID        uint      `gorm:"primaryKey" json:"id"`
	ObjectID  uint      `gorm:"not null;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"object_id"`
	URL       string    `gorm:"not null" json:"url"`
	IsPrimary bool      `gorm:"default:false" json:"is_primary"`
	Order     int       `gorm:"default:0" json:"order"`
	CreatedAt time.Time `json:"created_at"`
}

// Amenity представляет удобства объекта
type Amenity struct {
	ID          uint   `gorm:"primaryKey" json:"id"`
	Name        string `gorm:"uniqueIndex;not null" json:"name"`
	Category    string `json:"category"` // basic, comfort, safety, entertainment, etc.
	Icon        string `json:"icon"`     // иконка для фронтенда
	Description string `json:"description"`
}

// ObjectAmenity связь многие-ко-многим между Object и Amenity
type ObjectAmenity struct {
	ObjectID  uint `gorm:"primaryKey" json:"object_id"`
	AmenityID uint `gorm:"primaryKey" json:"amenity_id"`
}

// ObjectCreateRequest - запрос на создание объекта
type ObjectCreateRequest struct {
	Title       string     `json:"title" binding:"required"`
	Type        ObjectType `json:"type" binding:"required"`
	Description string     `json:"description" binding:"required"`
	City        string     `json:"city" binding:"required"`
	Address     string     `json:"address"`
	Latitude    float64    `json:"latitude"`
	Longitude   float64    `json:"longitude"`
	Price       float64    `json:"price"`
	PricePeriod string     `json:"price_period"`
	AmenityIDs  []uint     `json:"amenity_ids"`
}

// ObjectUpdateRequest - запрос на обновление объекта
type ObjectUpdateRequest struct {
	Title       string       `json:"title"`
	Type        ObjectType   `json:"type"`
	Description string       `json:"description"`
	City        string       `json:"city"`
	Address     string       `json:"address"`
	Latitude    float64      `json:"latitude"`
	Longitude   float64      `json:"longitude"`
	Price       float64      `json:"price"`
	PricePeriod string       `json:"price_period"`
	Status      ObjectStatus `json:"status"`
	AmenityIDs  []uint       `json:"amenity_ids"`
}
