/*
 * Copyright (C) 2022 Savoir-faire Linux Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this program.  If not, see
 * <https://www.gnu.org/licenses/>.
 */
import cors from 'cors';
import express, { json, NextFunction, Request, Response } from 'express';
import helmet from 'helmet';
import { HttpStatusCode } from 'jami-web-common';
import log from 'loglevel';
import { Service } from 'typedi';

import { checkAdminSetup } from './middleware/setup.js';
import { accountRouter } from './routers/account-router.js';
import { authRouter } from './routers/auth-router.js';
import { callRouter } from './routers/call-router.js';
import { contactsRouter } from './routers/contacts-router.js';
import { conversationRequestRouter } from './routers/conversation-request-router.js';
import { conversationRouter } from './routers/conversation-router.js';
import { defaultModeratorsRouter } from './routers/default-moderators-router.js';
import { linkPreviewRouter } from './routers/link-preview-router.js';
import { nameserverRouter } from './routers/nameserver-router.js';
import { setupRouter } from './routers/setup-router.js';
import { bindChatCallbacks } from './websocket/chat-handler.js';
import { bindWebRtcCallbacks } from './websocket/webrtc-handler.js';

@Service()
export class App {
  app = express();

  constructor() {
    // Setup middleware
    this.app.use(helmet());
    this.app.use(cors());
    this.app.use(json());

    // Enforce admin setup
    this.app.use('/setup', setupRouter);
    this.app.use(checkAdminSetup);

    // Setup routing
    this.app.use('/auth', authRouter);
    this.app.use('/account', accountRouter);
    this.app.use('/contacts', contactsRouter);
    this.app.use('/default-moderators', defaultModeratorsRouter);
    this.app.use('/conversations', conversationRouter);
    this.app.use('/conversation-requests', conversationRequestRouter);
    this.app.use('/calls', callRouter);
    this.app.use('/link-preview', linkPreviewRouter);
    this.app.use('/ns', nameserverRouter);

    // Setup WebSocket callbacks
    bindChatCallbacks();
    bindWebRtcCallbacks();

    // Setup 404 error handling
    this.app.use((_req, res) => {
      res.sendStatus(HttpStatusCode.NotFound);
    });

    // Setup internal error handling
    this.app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
      log.error(err);
      res.status(HttpStatusCode.InternalServerError).send(err.message);
    });
  }
}
