import {
  Conversation,
  ConversationMember,
} from "../../core/models/conversation.model";
import { client, collections } from "./database.service";

import { ObjectId } from "mongodb";

export class ConversationService {
  static async getConversationByOtherUserId(otherUserId: ObjectId) {
    // get all of the conversations for this user that have exactly two conversation members
    // get all of the conversationMembers for this user
    // get all of the conversations for this user
    // get all of the conversations
    // const query = { googleId: userId };
    // const res = await collections.users?.findOne(query);
    // // exists
    // if (res?._id) {
    //   return res as User;
    // }
    // return null;
  }

  static async getConversationsByIds(convoIds: ObjectId[]) {
    const query = { _id: { $in: convoIds } };

    const convosRes = await collections.conversations?.find(query).toArray();

    // exists
    if (convosRes?.length) {
      return convosRes as Conversation[];
    }

    return null;
  }

  static async getConversationsMembersByUserId(userId: string) {
    const query = { userId: new ObjectId(userId) };

    const convoMembersRes = await collections.conversationMembers
      ?.find(query)
      .toArray();

    // exists
    if (convoMembersRes?.length) {
      return convoMembersRes as ConversationMember[];
    }

    return null;
  }

  static async createConversation(
    convo: Conversation,
    convoMembers: ConversationMember[]
  ) {
    const session = client.startSession();
    try {
      const transactionResults = await session.withTransaction(async () => {
        // todo: check if convoMembers userId's actually exist

        const insertConvoRes = await collections.conversations?.insertOne(
          convo
        );
        if (!insertConvoRes?.insertedId) {
          await session.abortTransaction();
          console.error("failed to create convo");

          return;
        }

        const insertConvoMembersRes =
          await collections.conversationMembers?.insertMany(convoMembers);
        if (!insertConvoMembersRes?.insertedCount) {
          await session.abortTransaction();
          console.error("failed to create conversation members");

          return;
        }

        console.log("success");
        return insertConvoMembersRes;
      });

      console.log(transactionResults);

      return "success";

      // if (transactionResults) {
      //   console.log("The convo was successfully created.");
      //   return transactionResults;
      // } else {
      //   console.log("The convo was intentionally aborted.");
      //   return null;
      // }
    } catch (e) {
      console.log(
        "The transaction was aborted due to an unexpected error: " + e
      );
    } finally {
      await session.endSession();
    }

    return null;
  }
}
