import { decrypt } from "@/lib/cipher";
import {
  SESSION_ID_TOKEN_DEFAULTS,
  SESSION_TOKEN_DEFAULTS,
} from "@/lib/cookie";
import { getMemberSessionPayload } from "@/lib/session";
import type { Context } from "hono";
import { getCookie } from "hono/cookie";
import type { IMemberSessionRepository } from "./member-session.interfaces";

interface TMemberSessionServiceDeps {
  MemberSessionRepository: IMemberSessionRepository;
  CTX: Context;
}

export const MemberSessionServices = ({
  MemberSessionRepository,
  CTX,
}: TMemberSessionServiceDeps) => {
  const GetMemberBySession = async () => {
    try {
      const sessionID = getCookie(CTX, SESSION_ID_TOKEN_DEFAULTS.name);
      const sessionToken = getCookie(CTX, SESSION_TOKEN_DEFAULTS.name);
      if (!sessionID || !sessionToken) {
        throw new Error("Mising or invalid session");
      }
      const { accountID, contactID } = getMemberSessionPayload(
        decrypt(sessionToken!),
      );
      const {
        userRecord,
        sessionRecord,
        externalAccountTypeID,
        memberRecordID,
      } = await MemberSessionRepository.FindMemberSession(sessionID, contactID);
      return {
        userRecord,
        sessionRecord,
        accountID,
        contactID,
        externalAccountTypeID,
        memberRecordID,
      };
    } catch (err) {
      throw err;
    }
  };

  const GetMemberSessionsByUserId = async (userId: string) => {
    try {
      const records =
        await MemberSessionRepository.FindMemberSessionsByUserId(userId);
      return records;
    } catch (err) {
      throw err;
    }
  };

  return { GetMemberBySession, GetMemberSessionsByUserId };
};
