import asyncio

import discord
from redbot.core import commands
from redbot.core.i18n import Translator

_ = Translator("Announcer", __file__)


class Announcer:
    def __init__(self, ctx: commands.Context, message: str, config=None):
        """
        :param ctx:
        :param message:
        :param config: Used to determine channel overrides
        """
        self.ctx = ctx
        self.message = message
        self.config = config

        self.active = None

    def start(self):
        """
        Starts an announcement.
        :return:
        """
        if self.active is None:
            self.active = True
            self.ctx.bot.loop.create_task(self.announcer())

    def cancel(self):
        """
        Cancels a running announcement.
        :return:
        """
        self.active = False

    async def _get_announce_channel(self, guild: discord.Guild) -> discord.TextChannel:
        channel_id = await self.config.guild(guild).announce_channel()
        channel = None

        if channel_id is not None:
            channel = guild.get_channel(channel_id)

        if channel is None:
            channel = guild.system_channel

        if channel is None:
            channel = guild.text_channels[0]

        return channel

    async def announcer(self):
        guild_list = self.ctx.bot.guilds
        bot_owner = (await self.ctx.bot.application_info()).owner
        for g in guild_list:
            if not self.active:
                return

            if await self.config.guild(g).announce_ignore():
                continue

            channel = await self._get_announce_channel(g)

            try:
                await channel.send(self.message)
            except discord.Forbidden:
                await bot_owner.send(
                    _("I could not announce to server: {server.id}").format(server=g)
                )
            await asyncio.sleep(0.5)

        self.active = False
