import 'reflect-metadata'
import * as mongoose from 'mongoose';
import { Application, IBoot } from 'egg';
import { loadGmDb } from '@db/index';
import { connectRedis } from '@pubUtils/redis';

export default class FooBoot implements IBoot {
  private readonly app: Application;

  constructor(app: Application) {
    this.app = app;
  }

  async configWillLoad() {
    // Ready to call configDidLoad,`
    // Config, plugin files are referred,`
    // this is the last chance to modify the config.
    await this.connectDB(this.app)
    await this.connectGMDB(this.app);
    await this.connectRedis(this.app);

    this.app.config.realEnv = this.app.config.env;
    if(this.app.config.env == 'local') {
      this.app.config.realEnv = 'development';
    }

    // 如果gm使用的就是本机代理，host不转发到target而只把path替换
    if(this.app.config.httpProxy && this.app.config.httpProxy[`/api/${this.app.config.realEnv}/`]) {
      this.app.config.httpProxy[`/api/${this.app.config.realEnv}/`].changeOrigin = false;
    }
  }

  configDidLoad() {
    // Config, plugin files have loaded.
  }

  async didLoad() {
    // All files have loaded, start plugin here.
  }

  async willReady() {
    // All plugins have started, can do some thing before app ready.
    // await this.customLoadModel();
  }

  async didReady() {
    // Worker is ready, can do some things
    // don't need to block the app boot.
  }

  async serverDidReady() {
    // Server is listening.
  }

  async beforeClose() {
    // Do some thing before app close.
  }

  //#region 手动挂载model，测试需要ctx.model 

  public async connectDB(app: Application) {
    const { url, options } = app.config.mongoose
    try {
      if (url) {
        const connection = await mongoose.connect(url, options)
        console.log('******connectDB suc', url, options)
        app.context.connection = connection
      }
    } catch(e) {
      console.log(e)
    }
  }

  public async connectGMDB(app: Application) {
    const { url, options } = app.config.gmmongoose
    try {
      if (url) {
        const connection = await mongoose.createConnection(url, options)
        app.context.connectionGM = connection;
        loadGmDb(connection);
        console.log('******connectGMDB suc', url, options)
      }
    } catch(e) {
      console.log(e)
    }
  }

  public async connectRedis(app: Application) {
    const { url, pw } = app.config.redis
    if (url) {
      const redisClient = connectRedis(url, pw);
      app.context.redisClient = redisClient;
    }
  }
  //#endregion
}
  
  module.exports = FooBoot;