package repository

import (
	"api_yal/internal/models"
)

// RatingRepository интерфейс для операций с моделью Rating
//go:generate mockgen -destination=mocks/rating_repository.go -package=mocks . RatingRepository
type RatingRepository interface {
	// Create создает новый рейтинг
	Create(rating *models.Rating) error

	// GetByID возвращает рейтинг по ID
	GetByID(id uint) (*models.Rating, error)

	// GetByObjectAndPlatform возвращает рейтинг объекта для конкретной платформы
	GetByObjectAndPlatform(objectID uint, platform models.PlatformType) (*models.Rating, error)

	// Update обновляет существующий рейтинг
	Update(rating *models.Rating) error

	// Delete удаляет рейтинг
	Delete(id uint) error

	// List возвращает список рейтингов с пагинацией
	List(offset, limit int) ([]models.Rating, error)

	// Count возвращает общее количество рейтингов
	Count() (int64, error)

	// ListByObject возвращает все рейтинги объекта
	ListByObject(objectID uint) ([]models.Rating, error)

	// ListByOwner возвращает рейтинги по владельцу
	ListByOwner(ownerID uint, offset, limit int) ([]models.Rating, error)

	// ListByPlatform возвращает рейтинги по платформе
	ListByPlatform(platform models.PlatformType, offset, limit int) ([]models.Rating, error)

	// GetObject возвращает объект, к которому относится рейтинг
	GetObject(ratingID uint) (*models.Object, error)

	// GetVoteBreakdown возвращает детализацию голосов для рейтинга
	GetVoteBreakdown(ratingID uint) (*models.VoteBreakdown, error)

	// UpdateVoteBreakdown обновляет детализацию голосов
	UpdateVoteBreakdown(breakdown *models.VoteBreakdown) error

	// CreateRatingVote создает новый голос в рейтинге
	CreateRatingVote(vote *models.RatingVote) error

	// GetRatingVote возвращает голос пользователя по цели и платформе
	GetRatingVote(targetID uint, voterID uint, platform models.PlatformType) (*models.RatingVote, error)

	// UpdateRatingVote обновляет существующий голос
	UpdateRatingVote(vote *models.RatingVote) error

	// DeleteRatingVote удаляет голос
	DeleteRatingVote(id uint) error

	// CountVotesByTarget возвращает количество голосов по цели и платформе
	CountVotesByTarget(targetID uint, platform models.PlatformType) (int64, error)

	// CalculateAverageScore рассчитывает средний балл на основе VoteBreakdown
	CalculateAverageScore(breakdown *models.VoteBreakdown) float64
}