/* eslint-disable newline-per-chained-call */
import { Emoji, GuildTextableChannel, Member, Message } from 'eris';
import { Client, Event, RichEmbed } from '../class';

export default class MessageReactionAdd extends Event {
  public client: Client;

  constructor(client: Client) {
    super(client);
    this.event = 'messageReactionAdd';

    this.directorLogs = '807444198969835550';
    this.directorRole = '662163685439045632';
  }

  private directorLogs: string;

  private directorRole: string;


  public async run(message: Message<GuildTextableChannel>, emoji: Emoji, reactor: Member) {
    if (message.channel.id !== this.directorLogs) return;
    if (!(message instanceof Message)) {
      message = <Message<GuildTextableChannel>>(await (message as Message).channel.getMessage((message as Message).id));
    }
    if (message.author.id !== this.client.user.id) return;

    if (!reactor.roles[0]) {
      reactor = await message.channel.guild.getRESTMember(reactor.id);
    }

    if (!reactor.roles.includes(this.directorRole)) return;

    const proc = await this.client.db.Proclamation.findOne({ msg: message.id, processed: false });

    if (!proc?.votedDirectors.includes(reactor.id)) {
      let type: 'yea' | 'nay' | 'present';

      if (emoji.id === '578750988907970567') type = 'yea';
      else if (emoji.id === '578750737920688128') type = 'nay';
      else if (emoji.name === '🙋') type = 'present';

      const votes = proc.results;

      switch (type) {
        case 'yea':
          votes.yea++;
          await proc.updateOne({
            results: {
              ...proc.results,
              yea: votes.yea,
            },
            votedDirectors: [...proc.votedDirectors, reactor.id],
          });
          break;

        case 'nay':
          votes.nay++;
          await proc.updateOne({
            results: {
              ...proc.results,
              nay: votes.nay,
            },
            votedDirectors: [...proc.votedDirectors, reactor.id],
          });
          break;

        case 'present':
          votes.present++;
          await proc.updateOne({
            results: {
              ...proc.results,
              present: votes.present,
            },
            votedDirectors: [...proc.votedDirectors, reactor.id],
          });
          break;

        default: return;
      }

      const totalDirectors = message.channel.guild.members.filter((member) => member.roles.includes('662163685439045632'));

      if (votes.yea / totalDirectors.length >= 0.6) {
        await proc.updateOne({
          processed: true,
          results: {
            ...votes,
            absent: totalDirectors.length - (votes.present + votes.nay + votes.present),
          },
        });

        await message.delete(`Proclamation with ID ${proc.oID} processed.`);

        const embed = new RichEmbed();
        embed.setAuthor(message.embeds[0].author.name, message.embeds[0].author.icon_url);
        embed.setTitle('Proclamation');
        embed.setDescription(`${proc.oID}\n\n_This action is available on the Board Register System Directory. You can make changes or edit it [here](https://board.ins/repository)._\n\n__This proclamation was confirmed at ${new Date().toLocaleString()}.__`);
        embed.addField('Subject', proc.subject);
        embed.addField('Body', proc.body);
        embed.setColor(0x29b350);
        embed.setFooter('Library of Code sp-us | Board Register System', 'https://static.libraryofcode.org/library_of_code.png');
        embed.setTimestamp();

        this.client.util.transporter.sendMail({
          to: 'all-staff@lists.libraryofcode.org',
          from: 'Board Register System <internal@staff.libraryofcode.org>',
          subject: `PROCLAMATION ${proc.oID}`,
          text: `
          PROCLAMATION ${proc.oID}

          SPONSOR:
            ${message.embeds[0].author.name.split('#').slice(0, 1)}, ${message.embeds[0].author.name.split('#').slice(1).join(' ').split(', ').slice(1).join(', ')}

          VOTING RESULTS:
            YEA: ${proc.results.yea}
            NAY: ${proc.results.nay}
            PRESENT ${proc.results.present}
          
          SUBJECT:
            ${proc.subject}
          
          BODY: 
            ${proc.body}


          _____________________________________________________________________
          LIBRARY OF CODE SP-US | BOARD OF DIRECTORS
          BOARD REGISTER SYSTEM https://board.ins/
          `,
        });

        await message.channel.createMessage({ embed });
      }
    }
  }
}

