--[=[
@c GuildCategoryChannel x GuildChannel
@d Represents a channel category in a Discord guild, used to organize individual
text or voice channels in that guild.
]=]

local GuildChannel = require('containers/abstract/GuildChannel')
local FilteredIterable = require('iterables/FilteredIterable')
local enums = require('enums')

local channelType = assert(enums.channelType)

local GuildCategoryChannel, get = require('class')('GuildCategoryChannel', GuildChannel)

function GuildCategoryChannel:__init(data, parent)
	GuildChannel.__init(self, data, parent)
end

--[=[
@m createTextChannel
@t http
@p name string
@r GuildTextChannel
@d Creates a new GuildTextChannel with this category as it's parent. Similar to `Guild:createTextChannel(name)`
]=]
function GuildCategoryChannel:createTextChannel(name)
	local guild = self._parent
	local data, err = guild.client._api:createGuildChannel(guild._id, {
		name = name,
		type = channelType.text,
		parent_id = self._id
	})
	if data then
		return guild._text_channels:_insert(data)
	else
		return nil, err
	end
end

--[=[
@m createVoiceChannel
@t http
@p name string
@r GuildVoiceChannel
@d Creates a new GuildVoiceChannel with this category as it's parent. Similar to `Guild:createVoiceChannel(name)`
]=]
function GuildCategoryChannel:createVoiceChannel(name)
	local guild = self._parent
	local data, err = guild.client._api:createGuildChannel(guild._id, {
		name = name,
		type = channelType.voice,
		parent_id = self._id
	})
	if data then
		return guild._voice_channels:_insert(data)
	else
		return nil, err
	end
end

--[=[@p textChannels FilteredIterable Iterable of all textChannels in the Category.]=]
function get.textChannels(self)
	if not self._text_channels then
		local id = self._id
		self._text_channels = FilteredIterable(self._parent._text_channels, function(c)
			return c._parent_id == id
		end)
	end
	return self._text_channels
end

--[=[@p voiceChannels FilteredIterable Iterable of all voiceChannels in the Category.]=]
function get.voiceChannels(self)
	if not self._voice_channels then
		local id = self._id
		self._voice_channels = FilteredIterable(self._parent._voice_channels, function(c)
			return c._parent_id == id
		end)
	end
	return self._voice_channels
end

return GuildCategoryChannel
