import { SmtpNotificationFactory, NotificationFactory } from './factories/NotificationFactory';
import { AuthFacade } from './facades/AuthFacade';
import { LeaveFacade } from './facades/LeaveFacade';
import { BackdatedLeaveFacade } from './facades/BackdatedLeaveFacade';
import { CalendarFacade } from './facades/CalendarFacade';
import { AttendanceFacade } from './facades/AttendanceFacade';
import { TeamShiftFacade } from './facades/TeamShiftFacade';
import { CompensationFacade } from './facades/CompensationFacade';
import { HrAdminFacade } from './facades/HrAdminFacade';

export interface AppContainer {
  notifications: NotificationFactory;
  authFacade: AuthFacade;
  leaveFacade: LeaveFacade;
  backdatedLeaveFacade: BackdatedLeaveFacade;
  calendarFacade: CalendarFacade;
  attendanceFacade: AttendanceFacade;
  teamShiftFacade: TeamShiftFacade;
  compensationFacade: CompensationFacade;
  hrAdminFacade: HrAdminFacade;
}

export function createContainer(): AppContainer {
  const notifications = new SmtpNotificationFactory();
  return {
    notifications,
    authFacade: new AuthFacade(undefined, notifications),
    leaveFacade: new LeaveFacade(undefined, undefined, undefined, undefined, undefined, notifications),
    backdatedLeaveFacade: new BackdatedLeaveFacade(undefined, undefined, undefined, undefined, undefined, notifications),
    calendarFacade: new CalendarFacade(),
    attendanceFacade: new AttendanceFacade(undefined, undefined, undefined, notifications, new CompensationFacade(undefined, undefined, notifications)),
    teamShiftFacade: new TeamShiftFacade(undefined, notifications),
    compensationFacade: new CompensationFacade(undefined, undefined, notifications),
    hrAdminFacade: new HrAdminFacade(),
  };
}
