package models

// PlatformType определяет тип платформы, на которой используется рейтинг
type PlatformType string

const (
	// PlatformEntrepreneur - платформа для предпринимателей
	PlatformEntrepreneur PlatformType = "entrepreneur"
	// PlatformTourist - платформа для туристов
	PlatformTourist PlatformType = "tourist"
)

// Rating представляет агрегированную информацию о рейтинге объекта
// Содержит среднюю оценку, общее количество голосов и детализацию по баллам
type Rating struct {
	// Base содержит общие поля для всех моделей:
	// ID, CreatedAt, UpdatedAt, DeletedAt (история обновлений)
	Base `gorm:"embedded"`

	// OwnerID - идентификатор владельца рейтинга (аккаунта)
	OwnerID uint `json:"owner_id"`

	// ObjectID - идентификатор объекта, к которому относится рейтинг
	ObjectID uint `json:"object_id"`
	// Object - объект рейтинга, связанный по ObjectID
	Object Object `gorm:"foreignKey:ObjectID;references:ID" json:"object"`

	// Platform - платформа, к которой относится рейтинг (entrepreneur/tourist)
	Platform PlatformType `json:"platform"`
	// AverageScore - средняя оценка объекта (от 1 до 5)
	AverageScore float64 `json:"average_score"`
	// TotalVotes - общее количество проголосовавших пользователей
	TotalVotes int `json:"total_votes"`
	// VoteBreakdown - детализированная информация о распределении оценок
	VoteBreakdown VoteBreakdown `json:"vote_breakdown"`
}

// VoteBreakdown содержит детализацию количества оценок по каждому баллу
// Используется для отображения распределения голосов от 1 до 5
type VoteBreakdown struct {
	// Base содержит общие поля для всех моделей
	Base `gorm:"embedded"`

	// RatingID - идентификатор рейтинга, к которому относится детализация
	RatingID uint `json:"rating_id"`

	// Score1 - количество оценок "1"
	Score1 int `json:"score_1"`
	// Score2 - количество оценок "2"
	Score2 int `json:"score_2"`
	// Score3 - количество оценок "3"
	Score3 int `json:"score_3"`
	// Score4 - количество оценок "4"
	Score4 int `json:"score_4"`
	// Score5 - количество оценок "5"
	Score5 int `json:"score_5"`
}

// RatingVote представляет отдельный голос пользователя в рейтинге
// Хранит информацию о том, кто, когда и какую оценку поставил
type RatingVote struct {
	// Base содержит общие поля для всех моделей:
	// ID, CreatedAt, UpdatedAt, DeletedAt (история обновлений)
	Base `gorm:"embedded"`

	// Platform - платформа, на которой был сделан голос
	Platform PlatformType `json:"platform"`
	// TargetID - идентификатор объекта, которому поставлена оценка
	TargetID uint `json:"target_id"`
	// VoterID - идентификатор пользователя, поставившего оценку
	VoterID uint `json:"voter_id"`
	// Score - поставленная оценка (допустимые значения: от 1 до 5)
	Score int `json:"score"`
}