import { ConsoleFeatureRepository } from "@/internal/console-features/console-features.repository";
import { ConsoleFeatureServices } from "@/internal/console-features/console-features.services";
import { ConsoleRolePrivilegesRepository } from "@/internal/console-role-privileges/console-role-privileges.repository";
import { ConsoleRolePrivilegesServices } from "@/internal/console-role-privileges/console-role-privileges.services";
import { ConsoleRolesRepository } from "@/internal/console-roles/console-roles.repository";
import { ConsoleRoleServices } from "@/internal/console-roles/console-roles.services";
import { ConsoleUserRolesRepository } from "@/internal/console-user-roles/console-user-roles.repository";
import { ConsoleUserRolesServices } from "@/internal/console-user-roles/console-user-roles.services";
import { ConsoleUserSessionRepository } from "@/internal/console-user-sessions/console-user-session.repository";
import { ConsoleUserSessionServices } from "@/internal/console-user-sessions/console-user-session.services";
import { ConsoleUserRepository } from "@/internal/console-users/console-users.repository";
import { ConsoleUserServices } from "@/internal/console-users/console-users.services";
import { ConsoleUserAccessListRepository } from "@/internal/console-user-access-list/console-user-access-list.repository";
import { ConsoleUserAccessListServices } from "@/internal/console-user-access-list/console-user-access-list.services";
import { VerificationTokenRepository } from "@/internal/verification-tokens/verification-tokens.repository";
import { VerificationTokenServices } from "@/internal/verification-tokens/verification-tokens.services";
import { DashboardRepository } from "@/internal/dashboard/dashboard.repository";
import { DashboardAccessServices } from "@/internal/dashboard/dashboard-access.services";
import { DashboardServices } from "@/internal/dashboard/dashboard.services";
import { DashboardPublicLinkServices } from "@/internal/dashboard/dashboard-public-link.services";
import { DashboardUploadServices } from "@/internal/dashboard/dashboard-upload.services";
import { DashboardStorage } from "@/lib/storage/dashboard-storage";
import type { Context } from "hono";
import { DashboardController } from "./dashboard.controller";
import { DashboardPublicController } from "./dashboard-public.controller";
import { ConsoleUserController } from "./console-users.controller";
import { ChatbotController } from "./chatbot.controller";
import { ConsoleUserRoleController } from "./console-user-roles.controller";
import { ConsoleUserAccessListController } from "./console-user-access-list.controller";
import { AdminActivityLogController } from "./admin-activity-logs.controller";


// Repositories
const injectRepositories = (ctx: Context) => {
  return {
    ConsoleUserRepository: ConsoleUserRepository(ctx),
    ConsoleUserSessionRepository: ConsoleUserSessionRepository(ctx),
    ConsoleFeatureRepository: ConsoleFeatureRepository(ctx),
    ConsoleRolesRepository: ConsoleRolesRepository(ctx),
    ConsoleUserRolesRepository: ConsoleUserRolesRepository(ctx),
    ConsoleRolePrivilegesRepository: ConsoleRolePrivilegesRepository(ctx),
    VerificationTokenRepository: VerificationTokenRepository(ctx),
  };
};

// Services
const injectServices = (ctx: Context) => {
  const {
    ConsoleUserRepository,
    ConsoleUserSessionRepository,
    ConsoleFeatureRepository,
    ConsoleRolesRepository,
    ConsoleUserRolesRepository,
    ConsoleRolePrivilegesRepository,
    VerificationTokenRepository,
  } = injectRepositories(ctx);
  const ConsoleUserAccessListRepositoryInstance =
    ConsoleUserAccessListRepository(ctx);

  const consoleUserSessionServices = ConsoleUserSessionServices({
    ConsoleUserSessionRepository,
  });

  const consoleUserRolesServices = ConsoleUserRolesServices({
    ConsoleUserRolesRepository,
  });

  const verificationTokenServices = VerificationTokenServices({
    VerificationTokenRepository,
  });

  const consoleUserServices = ConsoleUserServices({
    ConsoleUserRepository,
    ConsoleUserSessionServices: consoleUserSessionServices,
    ConsoleUserRolesServices: consoleUserRolesServices,
    VerificationTokenServices: verificationTokenServices,
  });

  const consoleFeatureServices = ConsoleFeatureServices({
    ConsoleFeatureRepository,
  });

  const consoleRoleServices = ConsoleRoleServices({
    ConsoleRolesRepository,
    ConsoleUserRolesServices: consoleUserRolesServices,
    ConsoleUserSessionServices: consoleUserSessionServices,
  });

  const consoleUserAccessListServices = ConsoleUserAccessListServices({
    ConsoleUserAccessListRepository: ConsoleUserAccessListRepositoryInstance,
    ConsoleUserRepository,
  });

  // Static-dashboard hosting. dashboardStorage is the PRIVATE GCS adapter —
  // bundles are only ever reachable through the serve proxy.
  const dashboardRepository = DashboardRepository(ctx);
  const dashboardStorage = DashboardStorage();
  const dashboardAccessServices = DashboardAccessServices({
    DashboardRepository: dashboardRepository,
    ConsoleUserRepository,
  });
  const dashboardPublicLinkServices = DashboardPublicLinkServices({
    DashboardRepository: dashboardRepository,
    DashboardAccessServices: dashboardAccessServices,
  });
  const dashboardServices = DashboardServices({
    DashboardRepository: dashboardRepository,
    DashboardAccessServices: dashboardAccessServices,
    DashboardUploadServices: DashboardUploadServices({
      DashboardStorage: dashboardStorage,
    }),
    DashboardStorage: dashboardStorage,
  });

  return {
    DashboardServices: dashboardServices,
    DashboardAccessServices: dashboardAccessServices,
    DashboardPublicLinkServices: dashboardPublicLinkServices,
    DashboardStorage: dashboardStorage,
    ConsoleUserServices: consoleUserServices,
    ConsoleUserSessionServices: consoleUserSessionServices,
    ConsoleFeatureServices: consoleFeatureServices,
    ConsoleRoleServices: consoleRoleServices,
    ConsoleUserRolesServices: consoleUserRolesServices,
    ConsoleUserAccessListServices: consoleUserAccessListServices,
    ConsoleRolePrivilegesServices: ConsoleRolePrivilegesServices({
      ConsoleRolePrivilegesRepository,
      ConsoleUserRolesServices: consoleUserRolesServices,
      ConsoleUserServices: consoleUserServices,
    }),
  };
};

// Controllers
export const V1Controllers = (ctx: Context) => {
  const {
    ConsoleUserServices,
    ConsoleUserSessionServices,
    ConsoleFeatureServices,
    ConsoleRoleServices,
    ConsoleUserRolesServices,
    ConsoleUserAccessListServices,
    ConsoleRolePrivilegesServices,
    DashboardServices: dashboardServices,
    DashboardPublicLinkServices: dashboardPublicLinkServices,
    DashboardStorage: dashboardStorage,
  } = injectServices(ctx);
  return {
    DashboardController: DashboardController(ctx, {
      DashboardServices: dashboardServices,
      DashboardPublicLinkServices: dashboardPublicLinkServices,
      DashboardStorage: dashboardStorage,
    }),
    DashboardPublicController: DashboardPublicController(ctx, {
      DashboardPublicLinkServices: dashboardPublicLinkServices,
      DashboardStorage: dashboardStorage,
    }),
    ConsoleUserController: ConsoleUserController(ctx, {
      ConsoleUserServices,
      ConsoleUserSessionServices,
      ConsoleUserRolesServices,
      ConsoleRolePrivilegesServices,
    }),
    ChatbotController: ChatbotController(ctx),
    ConsoleUserRoleController: ConsoleUserRoleController(ctx, {
      ConsoleFeatureServices,
      ConsoleRoleServices,
    }),
    ConsoleUserAccessListController: ConsoleUserAccessListController(ctx, {
      ConsoleUserAccessListServices,
      ConsoleUserServices,
    }),
    AdminActivityLogController: AdminActivityLogController(ctx),
  };
};

