package repository

import (
	"api_yal/internal/models"
)

// ObjectRepository интерфейс для операций с моделью Object
//go:generate mockgen -destination=mocks/object_repository.go -package=mocks . ObjectRepository
type ObjectRepository interface {
	// Create создает новый объект
	Create(object *models.Object) error

	// GetByID возвращает объект по ID
	GetByID(id uint) (*models.Object, error)

	// Update обновляет существующий объект
	Update(object *models.Object) error

	// Delete помечает объект как удаленный
	Delete(id uint) error

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

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

	// ListByOwner возвращает объекты по владельцу
	ListByOwner(ownerID uint, offset, limit int) ([]models.Object, error)

	// ListByType возвращает объекты по типу
	ListByType(objectType string, offset, limit int) ([]models.Object, error)

	// ListByStatus возвращает объекты по статусу
	ListByStatus(isActive bool, offset, limit int) ([]models.Object, error)

	// Search находит объекты по названию, типу или адресу
	Search(query string, offset, limit int) ([]models.Object, error)

	// GetOwner возвращает владельца объекта
	GetOwner(objectID uint) (*models.Account, error)

	// GetTouristRating возвращает туристический рейтинг объекта
	GetTouristRating(objectID uint) (*models.Rating, error)

	// GetEntrepreneurRating возвращает рейтинг для предпринимателей
	GetEntrepreneurRating(objectID uint) (*models.Rating, error)

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

	// GetFeedbacks возвращает отзывы об объекте
	GetFeedbacks(objectID uint, offset, limit int) ([]models.Feedback, error)

	// GetFeedbackCount возвращает количество отзывов об объекте
	GetFeedbackCount(objectID uint) (int, error)

	// UpdateFeedbackCount обновляет количество отзывов у объекта
	UpdateFeedbackCount(objectID uint, count int) error

	// ToggleVerification переключает статус верификации объекта
	ToggleVerification(id uint, verified bool) error

	// GetNearby возвращает объекты в радиусе
	GetNearby(latitude, longitude, radius float64, offset, limit int) ([]models.Object, error)
}