import { readFileSync } from 'fs'
import { Util } from 'service-core'

export function run(http, orgPort, ctx) {
  let localUtil = new Util(import.meta.url)
  let packagePath = localUtil.getPathFromRoot('../package.json')
  let packageInfo = JSON.parse(readFileSync(packagePath))

  const server = http.createServer(function (req, res) {
    const d1 = new Date().getTime()
    let finishedRequest = false
    var done = function () {
      if (finishedRequest) return
      finishedRequest = true
      var requestTime = new Date().getTime() - d1

      let level = 'info'
      if (res.statusCode >= 400) {
        level = 'warn'
      }
      if (res.statusCode >= 500) {
        level = 'error'
      }

      let status = ''
      if (res.statusCode >= 400) {
        status = res.statusCode + ' '
      }

      ctx.log[level]({
        duration: requestTime,
        status: res.statusCode,
      }, `<-- ${status}${req.method} ${req.url}`)
    }
    
    res.addListener('finish', done);
    res.addListener('close', done);

    res.writeHead(200);
    res.write(JSON.stringify(packageInfo, null, '  '))
    res.end()
  })

  let port = orgPort || 4000

  return server.listenAsync(port)
  .then(function() {
    ctx.log.event.info(`Server is listening on ${port} serving package ${packagePath}`)
    ctx.log.info(`Server is listening on ${port} serving package ${packagePath}`)
  })
}