import Partner, {
  PartnerCommissionType,
  PartnerDepartment,
  PartnerModel,
  PartnerRoleType,
  PartnerTitle,
} from "../database/Partner";
import Member, { MemberAdditionalAcknowledgement, MemberModel } from "../database/Member";
import { Client, GuildMember, User } from "discord.js";
import { guildID } from "../config.json";
import { Ref } from "@typegoose/typegoose";

export interface PartnerOptions {
  roleType: PartnerRoleType;
  commissionType: PartnerCommissionType;
  department: PartnerDepartment;
  title: PartnerTitle;
  directReport: Ref<Partner>;
}

export interface FormatNameOptions {
  text: string;
  iconURL: string;
}

// TODO: Add the rest of the remaining role configurations
export const PartnerDiscordRoleMap = {
  // Director of Engineering, Management, Staff, Technician, Core Team, Play Caller
  Engineering: [
    "1077646568091570236",
    "1077646956890951690",
    "446104438969466890",
    "701454780828221450",
    "453689940140883988",
    "1014978134573064293",
  ],
  // Director of Operations, Management, Staff, Moderator, Core Team, Play Caller
  Operations: [
    "1077647072163020840",
    "1077646956890951690",
    "446104438969466890",
    "455972169449734144",
    "453689940140883988",
    "1014978134573064293",
  ],
};

export default class MemberUtil {
  public static async createNewPartner(member: Member, options: PartnerOptions) {
    const partner = new PartnerModel();
    partner.discordID = member.discordID;
    partner.roleType = options.roleType;
    partner.commissionType = options.commissionType;
    partner.department = options.department;
    partner.title = options.title;
    partner.directReport = options.directReport;
    await partner.save();
    return partner;
  }

  public static async getPartner(member: Member) {
    return PartnerModel.findOne({ discordID: member.discordID });
  }

  public static async deletePartner(member: Member) {
    return PartnerModel.deleteOne({ discordID: member.discordID });
  }

  public static addAcknowledgementToMember(
    member: Member,
    acknowledgement: MemberAdditionalAcknowledgement
  ) {
    if (!member.additionalAcknowledgement || member.additionalAcknowledgement?.length === 0) {
      MemberModel.updateOne({ discordID: member.discordID }, { additionalAcknowledgement: [] });
    }
    if (member.additionalAcknowledgement?.includes(acknowledgement))
      throw new Error("This member already has this acknowledgement.");
    return MemberModel.updateOne(
      { discordID: member.discordID },
      { $push: { additionalAcknowledgement: acknowledgement } }
    );
  }
}