// Import Express
import express from 'express';

// Import mango type
import { Collection } from 'dce-mango';

// Import types
import CanvasAPI from './shared/types/CanvasAPI';
import GetCourseEvent from './shared/types/GetCourseEvent';
import LogAction from './types/LogAction';
import LogError from './types/LogError';
import RecordAttendanceFunction from './shared/types/RecordAttendanceFunction';

// Import constants
import STUDENT_PATH_PREFIX from './shared/constants/STUDENT_PATH_PREFIX';
import TTM_PATH_PREFIX from './shared/constants/TTM_PATH_PREFIX';

// Import DB connections
import { initCollections } from './initCollections';

// Import logger initializer
import { initLogger } from './initLogger';

// Import routes
import addStudentRoutes from './addRoutes/addStudentRoutes';
import addTTMRoutes from './addRoutes/addTTMRoutes';

/**
 * Function to add the dce-check-in-ui backend to your Express app.
 * @author Benedikt Arnarsson
 * @param app the Express app that will handle the check-in UI backend calls.
 * @param opts.getCanvasAPI function for retrieving the Canvas API.
 * @param opts.CollectionCons constructor for Collection type (dce-mango).
 * @param opts.recordAttendance function for recording student attendance.
 * @param opts.logAction function for logging backend actions.
 * @param opts.logError function for logging backend errors.
 */
const addCheckInRoutes = (opts: {
  app: express.Application,
  getCanvasAPI: () => CanvasAPI,
  CollectionCons: typeof Collection,
  recordAttendance: RecordAttendanceFunction,
  getCourseEvent: GetCourseEvent,
  logAction: LogAction,
  logError: LogError,
}): void => {
  // Destructure
  const {
    app,
    getCanvasAPI,
    CollectionCons,
    recordAttendance,
    getCourseEvent,
    logAction,
    logError,
  } = opts;

  // Get DB connections
  initCollections(CollectionCons);

  // Setup logger
  initLogger(logAction, logError);

  // Add TTM routes
  const ttmRouter = addTTMRoutes();
  app.use(TTM_PATH_PREFIX, ttmRouter);

  // Add student routes (for everyone)
  const studentRouter = addStudentRoutes(
    recordAttendance,
    getCanvasAPI,
    getCourseEvent,
  );
  app.use(STUDENT_PATH_PREFIX, studentRouter);
};

export {
  // eslint-disable-next-line import/prefer-default-export
  addCheckInRoutes,
};
