package interfaces

import (
	"time"
)

// Types de base pour les interfaces

// User représente un utilisateur
type User struct {
	ID        string    `json:"id"`
	Username  string    `json:"username"`
	Email     string    `json:"email"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

// Message représente un message
type Message struct {
	ID             string    `json:"id"`
	ConversationID string    `json:"conversation_id"`
	UserID         string    `json:"user_id"`
	Content        string    `json:"content"`
	CreatedAt      time.Time `json:"created_at"`
	UpdatedAt      time.Time `json:"updated_at"`
}

// Conversation représente une conversation
type Conversation struct {
	ID        string    `json:"id"`
	Name      string    `json:"name"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

// Track représente une track audio
type Track struct {
	ID        string    `json:"id"`
	Title     string    `json:"title"`
	Artist    string    `json:"artist"`
	Duration  int       `json:"duration"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

// Session représente une session utilisateur
type Session struct {
	ID        string    `json:"id"`
	UserID    string    `json:"user_id"`
	Token     string    `json:"token"`
	CreatedAt time.Time `json:"created_at"`
	ExpiresAt time.Time `json:"expires_at"`
}

// AuditLog représente un log d'audit
type AuditLog struct {
	ID        string    `json:"id"`
	UserID    string    `json:"user_id"`
	Action    string    `json:"action"`
	Resource  string    `json:"resource"`
	CreatedAt time.Time `json:"created_at"`
}

// Types de requêtes

// AuthResult représente le résultat d'une authentification
type AuthResult struct {
	AccessToken  string `json:"access_token"`
	RefreshToken string `json:"refresh_token"`
	User         *User  `json:"user"`
}

// RegisterRequest représente une requête d'inscription
type RegisterRequest struct {
	Username string `json:"username"`
	Email    string `json:"email"`
	Password string `json:"password"`
}

// TokenClaims représente les claims d'un token JWT
type TokenClaims struct {
	UserID   string `json:"user_id"`
	Username string `json:"username"`
	Email    string `json:"email"`
}

// CreateUserRequest représente une requête de création d'utilisateur
type CreateUserRequest struct {
	Username string `json:"username"`
	Email    string `json:"email"`
	Password string `json:"password"`
}

// UpdateUserRequest représente une requête de mise à jour d'utilisateur
type UpdateUserRequest struct {
	Username string `json:"username"`
	Email    string `json:"email"`
}

// ListUsersRequest représente une requête de liste d'utilisateurs
type ListUsersRequest struct {
	Limit  int `json:"limit"`
	Offset int `json:"offset"`
}

// ListUsersResponse représente une réponse de liste d'utilisateurs
type ListUsersResponse struct {
	Users []*User `json:"users"`
	Total int64   `json:"total"`
}

// UpdateProfileRequest représente une requête de mise à jour de profil
type UpdateProfileRequest struct {
	Username string `json:"username"`
	Email    string `json:"email"`
	Bio      string `json:"bio"`
}

// SendMessageRequest représente une requête d'envoi de message
type SendMessageRequest struct {
	ConversationID string `json:"conversation_id"`
	Content        string `json:"content"`
}

// ListMessagesRequest représente une requête de liste de messages
type ListMessagesRequest struct {
	Limit  int `json:"limit"`
	Offset int `json:"offset"`
}

// ListMessagesResponse représente une réponse de liste de messages
type ListMessagesResponse struct {
	Messages []*Message `json:"messages"`
	Total    int64      `json:"total"`
}

// UpdateMessageRequest représente une requête de mise à jour de message
type UpdateMessageRequest struct {
	Content string `json:"content"`
}

// CreateConversationRequest représente une requête de création de conversation
type CreateConversationRequest struct {
	Name string `json:"name"`
}

// ListConversationsRequest représente une requête de liste de conversations
type ListConversationsRequest struct {
	Limit  int `json:"limit"`
	Offset int `json:"offset"`
}

// ListConversationsResponse représente une réponse de liste de conversations
type ListConversationsResponse struct {
	Conversations []*Conversation `json:"conversations"`
	Total         int64           `json:"total"`
}

// UpdateConversationRequest représente une requête de mise à jour de conversation
type UpdateConversationRequest struct {
	Name string `json:"name"`
}

// UploadTrackRequest représente une requête d'upload de track
type UploadTrackRequest struct {
	Title  string `json:"title"`
	Artist string `json:"artist"`
	File   []byte `json:"file"`
}

// ListTracksRequest représente une requête de liste de tracks
type ListTracksRequest struct {
	Limit  int `json:"limit"`
	Offset int `json:"offset"`
}

// ListTracksResponse représente une réponse de liste de tracks
type ListTracksResponse struct {
	Tracks []*Track `json:"tracks"`
	Total  int64    `json:"total"`
}

// UpdateTrackRequest représente une requête de mise à jour de track
type UpdateTrackRequest struct {
	Title  string `json:"title"`
	Artist string `json:"artist"`
}

// SearchTracksRequest représente une requête de recherche de tracks
type SearchTracksRequest struct {
	Query  string `json:"query"`
	Limit  int    `json:"limit"`
	Offset int    `json:"offset"`
}

// SearchTracksResponse représente une réponse de recherche de tracks
type SearchTracksResponse struct {
	Tracks []*Track `json:"tracks"`
	Total  int64    `json:"total"`
}

// UploadFileRequest représente une requête d'upload de fichier
type UploadFileRequest struct {
	Filename string `json:"filename"`
	File     []byte `json:"file"`
}

// UploadFileResponse représente une réponse d'upload de fichier
type UploadFileResponse struct {
	FileID string `json:"file_id"`
	URL    string `json:"url"`
}

// DownloadFileResponse représente une réponse de téléchargement de fichier
type DownloadFileResponse struct {
	Filename string `json:"filename"`
	Content  []byte `json:"content"`
}

// FileMetadata représente les métadonnées d'un fichier
type FileMetadata struct {
	ID        string    `json:"id"`
	Filename  string    `json:"filename"`
	Size      int64     `json:"size"`
	MimeType  string    `json:"mime_type"`
	CreatedAt time.Time `json:"created_at"`
}

// Notification représente une notification
type Notification struct {
	ID        string    `json:"id"`
	UserID    string    `json:"user_id"`
	Message   string    `json:"message"`
	Read      bool      `json:"read"`
	CreatedAt time.Time `json:"created_at"`
}

// MigrationStatus représente le statut d'une migration
type MigrationStatus struct {
	Version   string    `json:"version"`
	Applied   bool      `json:"applied"`
	AppliedAt time.Time `json:"applied_at"`
}
