login = {

link: $ 'a[href$="Login"]'
form: $ '#loginModal'
field: $ '#personalToken'
submit: $ '#submitLogin'
feedback: $('#loginModal').find '.invalid-feedback'
warn: (message) ->
  login.field.addClass('is-invalid').focus()
  login.feedback.text message
  return
reset: () ->
  login.field.removeClass 'is-invalid'
  login.field.val ''
  login.submit.prop 'disabled', false
  return
init: () ->
  login.link
    .attr 'data-placement', "left"
    .on "click", login.modal_event
  login.submit.on "click", login.submit_event
  if storage.get('token') and login.link.text() == "Login"
    login.link
      .text 'Logout'
      .attr 'href', 'Logout'
      .attr 'title', "Logged as #{storage.get('user')}"
      .attr 'data-toggle', 'tooltip'
      .off "click", login.modal_event
      .on "click", login.logout_event
  true
request: () ->
  login.field.removeClass 'is-invalid'
  login.submit.prop 'disabled', true
  $.ajax 'https://api.github.com/user',
    type: 'GET'
    headers: {"Authorization": "token #{login.field.val()}"}
    success: login.success
    error: login.error
  true
success: (data, status) ->
  login.form.modal 'hide'
  login.log = true
  storage
    .set 'token', login.field.val()
    .set 'user', data.login
    .set 'logged', new Date().getTime()
  login.link
    .text 'Logout'
    .attr 'href', 'Logout'
    .attr 'title', "Logged as #{data.login}"
    .attr 'data-toggle', 'tooltip'
    .tooltip 'show'
    .off "click", login.modal_event
    .on "click", login.logout_event
  setTimeout ->
    login.link.tooltip 'hide'
  , 3000
  true
error: (request, status, error) ->
  login.warn "#{status}: #{error}"
  login.submit.prop 'disabled', false
  true
logout_event: (e) ->
  e.preventDefault()
  login.log = false
  storage.clear()
  $ e.target
    .text 'Login'
    .attr 'href', 'Login'
    .attr 'data-original-title', "Logged Out"
    .tooltip 'show'
    .off "click", login.logout_event
    .on "click", login.modal_event
  setTimeout ->
    $ e.target
      .tooltip 'dispose'
  , 3000
  true
modal_event: (e) -> 
  e.preventDefault()
  login.reset()
  login.form.modal 'show'
  login.field.focus()
  true
submit_event: (e) ->
  e.preventDefault()
  if login.field.val().length == 40 then login.request() else login.warn 'Invalid token'
  true

}

login.init()