package repository

import (
	"api_yal/internal/models"
)

// AppealRepository интерфейс для операций с моделью Appeal
//go:generate mockgen -destination=mocks/appeal_repository.go -package=mocks . AppealRepository
type AppealRepository interface {
	// Create создает новое о��ращение
	Create(appeal *models.Appeal) error

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

	// Update обновляет существующее обращение
	Update(appeal *models.Appeal) error

	// Delete помечает обращение как удаленное
	Delete(id uint) error

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

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

	// ListByStatus возвращает обращения по статусу
	ListByStatus(status models.AppealStatus, offset, limit int) ([]models.Appeal, error)

	// ListByType возвращает обращения по типу
	ListByType(typeAppeal models.AppealType, offset, limit int) ([]models.Appeal, error)

	// ListByPriority возвращает обращения по приоритету
	ListByPriority(priority models.AppealPriority, offset, limit int) ([]models.Appeal, error)

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

	// GetAuthor возвращает автора обращения
	GetAuthor(appealID uint) (*models.Account, error)

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

	// GetFeedback возвращает отзыв, связанный с обращением
	GetFeedback(appealID uint) (*models.Feedback, error)

	// GetComment возвращает комментарий, связанный с обращением
	GetComment(appealID uint) (*models.Comment, error)

	// AssignTo назначает ответственного за обработку обращения
	AssignTo(appealID uint, assignedToID *uint) error

	// UpdateStatus обновляет статус обращения
	UpdateStatus(appealID uint, status models.AppealStatus) error

	// CreateHistory создает запись в истории изменений статуса
	CreateHistory(history *models.AppealHistory) error

	// ListHistory возвращает историю изменений статуса обращения
	ListHistory(appealID uint, offset, limit int) ([]models.AppealHistory, error)
}