import knex from "../knex";
import ReactionRole from "../models/ReactionRole";

export class GuildReactionRoles {
  protected guildId: string;

  constructor(guildId) {
    this.guildId = guildId;
  }

  async all(): Promise<ReactionRole[]> {
    const results = await knex("reaction_roles")
      .where("guild_id", this.guildId)
      .select();

    return results.map(r => new ReactionRole(r));
  }

  async getForMessage(messageId: string): Promise<ReactionRole[]> {
    const results = await knex("reaction_roles")
      .where("guild_id", this.guildId)
      .where("message_id", messageId)
      .select();

    return results.map(r => new ReactionRole(r));
  }

  async getByMessageAndEmoji(messageId: string, emoji: string): Promise<ReactionRole> {
    const result = await knex("reaction_roles")
      .where("guild_id", this.guildId)
      .where("message_id", messageId)
      .where("emoji", emoji)
      .first();

    return result ? new ReactionRole(result) : null;
  }

  async removeFromMessage(messageId: string, emoji: string = null) {
    let query = knex("reaction_roles")
      .where("guild_id", this.guildId)
      .where("message_id", messageId);

    if (emoji) {
      query = query.where("emoji", emoji);
    }

    await query.delete();
  }

  async add(channelId: string, messageId: string, emoji: string, roleId: string) {
    await knex("reaction_roles").insert({
      guild_id: this.guildId,
      channel_id: channelId,
      message_id: messageId,
      emoji,
      role_id: roleId
    });
  }
}