'use strict';

const utils = require('./utils')
const routes = require('./routes');
const redisConnect = require('./service/redis')
const socketConect = require('./service/socket')
const mqttVideoServer = require('./service/mqttVideoServer')
const paasRequest = require('./service/paasRequest');
const authenticator = require('./middlewares/authenticator');
const schedule = require('./schedule')
// const apiLog = require('./middlewares/api-log');

module.exports.entry = function (app, router, opts) {
   app.fs.logger.log('info', '[FS-AUTH]', 'Inject auth and api mv into router.');

   app.fs.api = app.fs.api || {};
   app.fs.utils = app.fs.utils || {};
   app.fs.api.authAttr = app.fs.api.authAttr || {};
   app.fs.api.logAttr = app.fs.api.logAttr || {};

   // 顺序固定 ↓ 
   redisConnect(app, opts)
   socketConect(app, opts)
   mqttVideoServer(app, opts)
   
   // 实例其他平台请求方法
   paasRequest(app, opts)

   // 工具类函数
   utils(app, opts)

   // 定时任务
   schedule(app, opts)
   
   // 鉴权中间件
   router.use(authenticator(app, opts));

   // 日志记录
   // router.use(apiLog(app, opts));

   router = routes(app, router, opts);
};

module.exports.models = function (dc) { // dc = { orm: Sequelize对象, ORM: Sequelize, models: {} }
   require('./models/nvr')(dc);
   require('./models/camera_ability')(dc);
   require('./models/camera_kind')(dc);
   require('./models/camera')(dc);
   require('./models/camera_ability_bind')(dc);
   require('./models/vender')(dc);
   require('./models/secret_yingshi')(dc);
   require('./models/gb_camera')(dc);
   require('./models/ax_project')(dc);
};