import { ConsoleUserSessionRepository } from "@/internal/console-user-sessions/console-user-session.repository";
import { ConsoleUserSessionServices } from "@/internal/console-user-sessions/console-user-session.services";
import {
  CONSOLE_USER_SESSION_ID_TOKEN_DEFAULTS,
  CONSOLE_USER_SESSION_TOKEN_DEFAULTS,
} from "@/lib/cookie";
import { error } from "@/lib/response";
import type { Context, Next } from "hono";
import { getCookie } from "hono/cookie";

export const withConsoleUserSession =
  () => async (ctx: Context, next: Next) => {
    const consoleUserSessionServices = ConsoleUserSessionServices({
      ConsoleUserSessionRepository: ConsoleUserSessionRepository(ctx),
    });

    const admin_session = getCookie(ctx, CONSOLE_USER_SESSION_TOKEN_DEFAULTS.name);
    const admin_session_id = getCookie(
      ctx,
      CONSOLE_USER_SESSION_ID_TOKEN_DEFAULTS.name,
    );
    if (!admin_session || !admin_session_id) {
      return error(ctx, "Unauthorized Access", 401);
    }

    const consoleUserSession =
      await consoleUserSessionServices.GetUserSession(admin_session_id);

    if (!consoleUserSession) {
      return error(ctx, "You are not authorized to access the services.", 403);
    }
    if (consoleUserSession.consoleUserRecord.email) {
      ctx.set("adminEmail", consoleUserSession.consoleUserRecord.email);
    }
    if (consoleUserSession.consoleUserRecord.id) {
      ctx.set("consoleUserId", consoleUserSession.consoleUserRecord.id);
    }
    if (consoleUserSession.consoleUserRecord.is_super_admin !== undefined) {
      ctx.set("isAdminConsoleSuperAdmin", consoleUserSession.consoleUserRecord.is_super_admin);
    }
    await next();
  };
