package models

import (
	"time"
)

// AppealType определяет тип обращения
type AppealType string

const (
	// AppealTypeComplaint - жалоба
	AppealTypeComplaint AppealType = "complaint"
	// AppealTypeSuggestion - предложение
	AppealTypeSuggestion AppealType = "suggestion"
	// AppealTypeWish - пожелание
	AppealTypeWish AppealType = "wish"
	// AppealTypeQuestion - вопрос
	AppealTypeQuestion AppealType = "question"
	// AppealTypeOther - другое
	AppealTypeOther AppealType = "other"
)

// AppealStatus определяет статус обработки обращения
type AppealStatus string

const (
	// AppealStatusNew - новое обращение
	AppealStatusNew AppealStatus = "new"
	// AppealStatusInProgress - в обработке
	AppealStatusInProgress AppealStatus = "in_progress"
	// AppealStatusResolved - решено
	AppealStatusResolved AppealStatus = "resolved"
	// AppealStatusRejected - отклонено
	AppealStatusRejected AppealStatus = "rejected"
	// AppealStatusClosed - закрыто
	AppealStatusClosed AppealStatus = "closed"
)

// AppealPriority определяет приоритет обращения
type AppealPriority string

const (
	// AppealPriorityLow - низкий
	AppealPriorityLow AppealPriority = "low"
	// AppealPriorityMedium - средний
	AppealPriorityMedium AppealPriority = "medium"
	// AppealPriorityHigh - высокий
	AppealPriorityHigh AppealPriority = "high"
	// AppealPriorityCritical - критичный
	AppealPriorityCritical AppealPriority = "critical"
)

// Appeal представляет обращение пользователя (жалоба, предложение, пожелание)
type Appeal struct {
	/*ID, CreatedAt, UpdatedAt, DeletedAt (Update's history)*/
	Base `gorm:"embedded"`

	// Автор обращения (может быть анонимным)
	AuthorID *uint    `gorm:"index" json:"author_id,omitempty"` // NULL для анонимных обращений
	Author   *Account `gorm:"foreignKey:AuthorID;references:ID" json:"author,omitempty"`

	// Основная информация
	Type     AppealType     `gorm:"not null;index" json:"type"`
	Status   AppealStatus   `gorm:"not null;default:'new';index" json:"status"`
	Priority AppealPriority `gorm:"not null;default:'medium';index" json:"priority"`

	// Содержание
	Title   string `gorm:"not null" json:"title"`
	Message string `gorm:"not null;type:text" json:"message"`

	// Вложения (ссылки на файлы, изображения)
	Attachments []string `gorm:"type:text[];serializer:json" json:"attachments,omitempty"`

	// Контактная информация для обратной связи (если автор не авторизован)
	ContactName  string `json:"contact_name,omitempty"`
	ContactEmail string `json:"contact_email,omitempty"`
	ContactPhone string `json:"contact_phone,omitempty"`

	// Связь с конкретными сущностями (опционально)
	ObjectID *uint   `gorm:"index" json:"object_id,omitempty"`
	Object   *Object `gorm:"foreignKey:ObjectID;references:ID" json:"object,omitempty"`

	FeedbackID *uint     `gorm:"index" json:"feedback_id,omitempty"`
	Feedback   *Feedback `gorm:"foreignKey:FeedbackID;references:ID" json:"feedback,omitempty"`

	CommentID *uint    `gorm:"index" json:"comment_id,omitempty"`
	Comment   *Comment `gorm:"foreignKey:CommentID;references:ID" json:"comment,omitempty"`

	// Метаданные
	IPAddress string `json:"ip_address,omitempty"`
	UserAgent string `json:"user_agent,omitempty"`

	// История обработки
	AssignedToID *uint    `gorm:"index" json:"assigned_to_id,omitempty"`
	AssignedTo   *Account `gorm:"foreignKey:AssignedToID;references:ID" json:"assigned_to,omitempty"`

	ResolvedAt *time.Time `json:"resolved_at,omitempty"`
	ResolvedBy *uint      `json:"resolved_by,omitempty"`
	Resolution string     `json:"resolution,omitempty"` // Ответ/решение по обращению

	// Дополнительные поля
	Category   string                 `json:"category,omitempty"` // Пользовательская категория
	Labels     []string               `gorm:"type:text[];serializer:json" json:"labels,omitempty"`
	CustomData map[string]interface{} `gorm:"type:jsonb;serializer:json" json:"custom_data,omitempty"`
}

// AppealHistory записывает историю изменений статуса обращения
type AppealHistory struct {
	Base Base `gorm:"embedded"`

	AppealID uint   `gorm:"not null;index" json:"appeal_id"`
	Appeal   Appeal `gorm:"foreignKey:AppealID;references:ID" json:"appeal,omitempty"`

	UserID *uint    `json:"user_id,omitempty"` // Кто изменил
	User   *Account `gorm:"foreignKey:UserID;references:ID" json:"user,omitempty"`

	OldStatus AppealStatus `json:"old_status"`
	NewStatus AppealStatus `json:"new_status"`

	Comment string `json:"comment,omitempty"` // Пояснение к изменению
}
