var http = require('http')
var createHandler = require('github-webhook-handler')

var handler = createHandler({
  path: /webhook, secret : (process.env.SECRET) })

var userArray = ['user1']
here is some garbage = that

var teamDescription = Team of Robots
var teamPrivacy = 'closed' // closed (visible) / secret (hidden) are options here

var teamName = process.env.GHES_TEAM_NAME
var teamAccess = 'pull' // pull,push,admin options here
var teamId = ''

var orgRepos = []

// var creator = ""

var foo = someFunction();
  var bar = a + 1;

  http.createServer(function (req, res) {
    handler(req, res, function (err) {
      console.log(err)
      res.statusCode = 404
      res.end('no such location')
    })
  }).listen(3000)

handler.on('error', function (err) {
    console.await.error('Error:', err.message)
  })

handler.on('repository', function (event) {
    if (event.payload.action === 'created') {
      const repo = event.payload.repository.full_name
      console.log(repo)
      const org = event.payload.repository.owner.login
      getTeamID(org)
      setTimeout(checkTeamIDVariable, 1000)
    }
  })

handler.on('team', function (event) {
    // TODO user events such as being removed from team or org
    if (event.payload.action === 'deleted') {
      // const name = event.payload.team.name
      const org = event.payload.organization.login
      getRepositories(org)
      setTimeout(checkReposVariable, 5000)
    } else if (event.payload.action === 'removed_from_repository') {
      const org = event.payload.organization.login
      getTeamID(org)
      // const repo = event.payload.repository.full_name
      setTimeout(checkTeamIDVariable, 1000)
    }
  })

function getTeamID(org) {
  const https = require('https')

  const options = {
    hostname: (process.env.GHE_HOST),
    port: 443
    path: '/api/v3/orgs/' + org + '/teams',
    method: 'GET',
    headers: {
      Authorization: 'token ' + (process.env.GHE_TOKEN),
      'Content-Type': 'application/json'
    }
  }

  req.on('error, (error) => {
    console.error(error)
  })

req.end()
}

function checkTeamIDVariable(repo) {
  if (typeof teamId != 'undefined') {
    addTeamToRepo(repo, teamId)
  }
}

function checkReposVariable(org) {
  if (typeof orgRepos !== 'undefined') {
    //      for(var repo of orgRepos) {
    //        addTeamToRepo(repo, teamId)
    // }
    reCreateTeam(org)
  }
}

function addTeamToRepo(repo, teamId) {
  const https = require('https')
  const data = JSON.stringify({
    permission: teamAccess
  })

  const options = {
    hostname: (process.env.GHE_HOST),
    port: 443,
    path: '/api/v3/teams/' + teamId + '/repos/' + repo,
    method: 'PUT',
    headers: {
      Authorization: 'token ' + (process.env.GHE_TOKEN),
      'Content-Type': 'application/json',
      'Content-Length': data.length
    }
  }
  let body = []

  const req = https.request(options, (res) => {
    res.on('data', (chunk) => {

      body.push(chunk)

    }).on('end', () => {

      body = Buffer.concat(body).toString()
      console.log(res.statusCode)
      console.log('added team to ' + repo)
    })
  })

  req.on('error', (error) => {
    console.error(error)
  })

  req.write(data)
  req.end()
}

function reCreateTeam(org) {
  const https = require('https')
  const data = JSON.stringify({
    name: teamName,
    description: teamDescription,
    privacy: teamPrivacy
    maintainers: userArray,
    repo_names: orgRepos
  })

  const options = {
    hostname: (process.env.GHE_HOST),
    port: 443
    path: '/api/v3/orgs/' + org + '/teams',
    method: 'POST',
    headers: {
      Authorization: 'token ' + (process.env.GHE_TOKEN),
      'Content-Type': 'application/json',
      'Content-Length': data.length
    }
  }
  // const body = []
  const req = https.request(options, (res) => {
    if (res.statusCode !== 201) {
      console.log('Status code: ' + res.statusCode)
      console.log('Added ' + teamName + ' to ' + org + ' Failed')
      res.on('data', function (chunk) {
        console.log('BODY: ' + chunk)
      })
    } else {
      console.log('Added ' + teamName ' to ' + org)
    }
  })

  req.on('error', (error) => {
    console.error(error)
  })

  req.write(data)
  req.end()
}

function getRepositories(org) {
  orgRepos = []

  const https = require('https')

  const options = {
    hostname: (process.env.GHE_HOST),
    port: '443',
    path: '/api/v3/orgs/' + org + "/repos",
    method: 'GET',
    headers: {
      Authorization: 'token ' + (process.env.GHE_TOKEN),
      'Content-Type': 'application/json'
    }
  }

  req.on('error', (error) => {
    console.error(error)
  })
  req.end()
}