import { Message, Role as DRole } from 'eris';
import { Client, Command } from '../class';

export default class Role extends Command {
  constructor(client: Client) {
    super(client);
    this.name = 'role';
    this.description = 'Manage the roles of a member.';
    this.usage = `${this.client.config.prefix}role <user> <roles>`;
    this.permissions = 6;
    this.enabled = true;
  }

  public async run(message: Message, args: string[]) {
    try {
      if (args.length < 2) return this.client.commands.get('help').run(message, [this.name]);
      const member = this.client.util.resolveMember(args[0], this.mainGuild);
      if (!member) return this.error(message.channel, 'Member not found');
      // if (!this.client.util.moderation.checkPermissions(member, message.member)) return this.error(message.channel, 'Permission denied.');
      const rolesList = args.slice(1).join(' ').split(', ');
      const rolesToAdd = [];
      const rolesToRemove = [];
      let stop = false;
      for (const arg of rolesList) {
        const action = arg[0];
        let role: DRole;
        if (action !== '+' && action !== '-') {
          role = this.client.util.resolveRole(arg, this.mainGuild);
          if (!role) {
            stop = true;
            return this.error(message.channel, `Role \`${arg}\` not found.`);
          }
          if (member.roles.includes(role.id)) return rolesToRemove.push(role);
          rolesToAdd.push(role);
          continue;
        }
        if (action === '+') {
          role = this.client.util.resolveRole(arg.slice(1), this.mainGuild);
          if (!role) {
            stop = true;
            return this.error(message.channel, `Role \`${arg.slice(1)}\` not found.`);
          }
          if (member.roles.includes(role.id)) {
            stop = true;
            return this.error(message.channel, `You already have the role \`${role.name}\`.`);
          }
          rolesToAdd.push(role);
          continue;
        }
        if (action === '-') {
          role = this.client.util.resolveRole(arg.slice(1), this.mainGuild);
          if (!role) {
            stop = true;
            return this.error(message.channel, `Role \`${arg.slice(1)}\` not found.`);
          }
          if (!member.roles.includes(role.id)) {
            stop = true;
            return this.error(message.channel, `You don't have the role \`${role.name}\``);
          }
          rolesToRemove.push(role);
          continue;
        }
      }
      // eslint-disable-next-line
      // if (stop) return;
      rolesToAdd.forEach((role) => member.addRole(role.id));
      rolesToRemove.forEach((role) => member.removeRole(role.id));
      return this.success(message.channel, `Changed roles for ${member.username}#${member.discriminator}${rolesToAdd.length > 0 ? `, added \`${rolesToAdd.map((r) => r.name).join('`, `')}\`` : ''}${rolesToRemove.length > 0 ? `, removed \`${rolesToRemove.map((r) => r.name).join('`, `')}\`` : ''}`);
    } catch (err) {
      return this.client.util.handleError(err, message, this);
    }
  }
}
