package chat

import (
	"sync"
	"time"
)

// Channel represents a chat channel with membership and message routing capabilities
type Channel struct {
	mu               sync.RWMutex
	name             string
	password         string
	channelType      int
	levelRestriction int32
	raceRestriction  int32
	classRestriction int32
	members          []int32 // Character IDs
	discordEnabled   bool
	created          time.Time
}

// ChannelMessage represents a message sent to a channel
type ChannelMessage struct {
	SenderID    int32
	SenderName  string
	Message     string
	LanguageID  int32
	ChannelName string
	Timestamp   time.Time
	IsEmote     bool
	IsOOC       bool
}

// ChannelMember represents a member in a channel
type ChannelMember struct {
	CharacterID   int32
	CharacterName string
	Level         int32
	Race          int32
	Class         int32
	JoinedAt      time.Time
}

// ChannelInfo provides basic channel information for client lists
type ChannelInfo struct {
	Name             string
	HasPassword      bool
	MemberCount      int
	LevelRestriction int32
	RaceRestriction  int32
	ClassRestriction int32
	ChannelType      int
}

// ChatChannelData represents persistent channel data from database
type ChatChannelData struct {
	Name             string
	Password         string
	LevelRestriction int32
	ClassRestriction int32
	RaceRestriction  int32
}

// ChatManager manages all chat channels and operations
type ChatManager struct {
	mu       sync.RWMutex
	channels map[string]*Channel
	database ChannelDatabase

	// Integration interfaces
	clientManager     ClientManager
	playerManager     PlayerManager
	languageProcessor LanguageProcessor
}

// ChatStatistics provides statistics about chat system usage
type ChatStatistics struct {
	TotalChannels   int
	WorldChannels   int
	CustomChannels  int
	TotalMembers    int
	MessagesPerHour int
	ActiveChannels  int
}

// ChannelFilter provides filtering options for channel lists
type ChannelFilter struct {
	MinLevel      int32
	MaxLevel      int32
	Race          int32
	Class         int32
	IncludeCustom bool
	IncludeWorld  bool
}
