import { TextChannel } from 'eris';
import { Client, RichEmbed } from '../class';

let interval: NodeJS.Timeout;

export default function checkLock(client: Client): NodeJS.Timeout {
  interval = setInterval(async () => {
    try {
      const moderations = await client.db.Moderation.find();
      const judgements = await client.db.Judgement.find().lean().exec();
      judgements.forEach(async (judgement) => {
        if (!judgement.expires) return;
        if (new Date() > judgement.expires) {
          await client.db.Judgement.deleteOne(({ _id: judgement._id }));
          const log = <TextChannel> client.guilds.get(this.client.config.guildID).channels.get('611584771356622849');
          const embed = new RichEmbed();
          embed.setTitle('Judgement - Rescind');
          embed.addField('Member', `<@${judgement.userID}>`, true);
          embed.addField('Rescinded by', 'SYSTEM', true);
          embed.setFooter(this.client.user.username, this.client.user.avatarURL);
          embed.setTimestamp();
          log.createMessage({ embed }).catch(() => {});
        }
      });
      moderations.forEach(async (moderation) => {
        if (!moderation.expiration) return;
        if (moderation.expiration.processed) return;
        if (new Date() > moderation.expiration.date) {
          await moderation.updateOne({ 'expiration.processed': true });

          const system = client.guilds.get(client.config.guildID).members.get(client.user.id);
          switch (moderation.type) {
            case 5:
              await client.util.moderation.unban(moderation.userID, system);
              break;
            case 2:
              if (await client.db.local.muted.get<boolean>(`muted-${moderation.userID}`) === true) {
                await client.util.moderation.unmute(moderation.userID, system);
              }
              break;
            default:
              break;
          }
          client.util.signale.complete(`Released member ${moderation.userID} | Queue date at ${moderation.expiration.date.toLocaleString('en-us')}`);
        }
      });
    } catch (error) {
      await client.util.handleError(error);
    }
  }, 10000);
  return interval;
}
