/** @format */

import { Eureka } from 'eureka-js-client'

const address = require('address')

const ip = address.ip() || '127.0.0.1'

interface IParams {
  port: number
  appName: string
  registerWithEureka?: boolean
}

function getParams(options: IParams) {
  const { port, appName, registerWithEureka = true } = options

  const env = !process.env.NODE_ENV || process.env.NODE_ENV === 'local' ? 'dev' : process.env.NODE_ENV

  const eurekaHosts = {
    dev: ['http://eureka.duibadev.com.cn'],
    test: ['http://eureka.duibatest.com.cn'],
    autotest: ['http://autotest-eureka.duibatest.com.cn'],
    aliyunTest: ['http://10.170.1.121:1025'],
    pre: ['http://10.30.10.61:1025'],
    prod: ['http://10.10.10.21:1025', 'http://10.20.10.22:1025']
  }

  let msg!: string

  if (!env) {
    msg = '无法获取到NODE_ENV'
  } else if (!eurekaHosts[env]) {
    msg = `NODE_ENV错误，只能为${Object.keys(eurekaHosts).join(',')}`
  }

  if (msg) {
    console.error(new Error(`Eureka Error，${msg}`))
    process.exit(1)
  }

  return {
    // application instance information
    instance: {
      instanceId: `${ip}:${appName}:${port}`,
      hostName: ip,
      app: appName,
      ipAddr: ip,
      status: 'UP',
      port: { $: port, '@enabled': 'true' },
      securePort: { $: '443', '@enabled': 'false' },
      homePageUrl: `http://${ip}:${port}/`,
      statusPageUrl: `http://${ip}:${port}/info`,
      healthCheckUrl: `http://${ip}:${port}/health`,
      lastDirtyTimestamp: +new Date(),
      vipAddress: appName,
      secureVipAddress: appName,
      dataCenterInfo: {
        '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
        name: 'MyOwn'
      },
      metadata: {
        weight: '100',
        'duiba.service.group.key': process.env.DUIBA_SERVICE_GROUP_KEY,
        zone: process.env.ZONE || 'defaultZone'
      }
    },
    eureka: {
      // eureka server host / port
      registerWithEureka,
      serviceUrls: {
        default: eurekaHosts[env].map((el: any) => `${el}/eureka/apps/`)
      }
    }
  }
}

export default function client(options: IParams) {
  const params: any = getParams(options)

  const client = new Eureka(params)

  return client
}
