var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/webhook', secret: (process.env.SECRET) })

var userArray = ['user1']

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 = ""

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.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'
    }
  }
  let body = []
  const req = https.request(options, (res) => {
    res.on('data', (chunk) => {
      body.push(chunk)
    }).on('end', () => {
      body = JSON.parse(Buffer.concat(body))
      body.forEach(item => {
        if (item.name === teamName) {
          teamId = item.id
        }
      })
    })
  })

  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'
    }
  }
  let body = []
  const req = https.request(options, (res) => {
    res.on('data', (chunk) => {
      body.push(chunk)
    }).on('end', () => {
      body = JSON.parse(Buffer.concat(body))
      body.forEach(item => {
        orgRepos.push(item.full_name)
        console.log(item.full_name)
      })
    })
  })

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

  req.end()
}