import cors from 'cors';
import express from 'express';
import bodyParser from 'body-parser';

import { useGlobals } from './globals';
import Routes from './routes';

class App {
  private readonly app: express.Express;
  private readonly address: string;
  private readonly port: number;

  private constructor({
    app,
    address,
    port,
    routes,
  }: any) {
    useGlobals();
    $db.sync().then(() => {
      $repos.userRoles.init().then(() => {
        $repos.users.syncAdminUser().then(() => {
          console.log('  The database is ready');
        })
      })
    })

    this.app = app;
    this.address = address;
    this.port = port;

    app.use(cors());
    app.use(bodyParser.json({ limit: '10mb' }));
    app.use(express.static('frontend/dist'));
    routes.register(app)
  }

  public static fromEnv(): App {
    const address = process.env.BACKEND_ADDRESS || '127.0.0.1';
    const port = new Number(process.env.BACKEND_PORT || 3000).valueOf();
    const app = express();
    const routes = new Routes();

    return new App({
      app,
      address,
      port,
      routes,
    });
  }

  public listen(): void {
    this.app.listen(this.port, this.address, () => {
      console.log(`Server is running on port ${this.address}:${this.port}`);
    });
  }
}

export default App;