#SHOW REPO class Perkins.Views.Repo extends Backbone.View

el: "#main-content"

events:
  'mouseenter #log a' : "replaceUri"
  'click #log .fold' :  "toggleFold"
  'click #restart-build-btn' : "restartBuild"
  'click .run-commit': "runCommit"

initialize: (opts)->
  @model = opts.model

  window.current_view = @

  if opts.build_id
    @build = new Perkins.Models.BuildReport({id: opts.build_id, repo: @model})
  else if @model.get('last_report_id')
    @build = new Perkins.Models.BuildReport({id: @model.get('last_report_id'), repo: @model})

  @listenTo(@build, "change", @renderBuildReport) if @build
  @listenTo(@build, "change:build_status", @pulseReport) if @build

  @listenTo(@model, "change:build_status", @handleSpinnerBtn)
  @listenTo(@model, "change:response", @renderLogView)

template: ()->
  JST["repo"](@model.toJSON())

replaceUri: (ev)->
  #console.log ev
  t = ev.currentTarget
  num = $(t.parentNode).prevAll('p').length + 1
  url = window.location + ''
  $(t).attr('href', url.replace(/#L\d+|(?=\?)|$/, '#L' + num))

handleSpinnerBtn: ->
  if @model.get('build_status') is "started"
    $(".fa-refresh").addClass("fa-spin")
  else if @model.get('build_status') is "stopped"
    $(".fa-refresh").removeClass("fa-spin")

toggleFold: (ev)->
  console.log ev
  $(ev.currentTarget).toggleClass('open')

render: ->
  console.log("render repo")
  $(@el).html(@template())
  @handleSpinnerBtn()

  if @build
    @build_detail = new Perkins.Views.BuildDetail( repo: @model, build: @build )
    @build.fetch()
    @displayBadge()

renderLogView: ->
  @build_detail.render()

displayBadge: ->
  name = @model.get('name')
  url  = "#{window.location.origin}/badge?repo=#{name}"
  badge = "<a href='#{url}' target='blank'><img src='#{url}' alt='badge'></a>"
  $('#badge-placeholder').html(badge)

renderBuildReport: ->
  @build_detail.render()

restartBuild: (ev)->
  return if $(ev.currentTarget).find("i").hasClass("fa-spin")
  @build_detail.restart()

pulseReport: ->
  @build_detail.pulse()

runCommit: ->
  url = "/repos/#{@model.get('name')}/run_commit.json"
  $.ajax
    url: url
    beforeSend: ->
      $(".no-build").text("running build")
      $(".run-commit").addClass("hide")

    error: (err)->
      $(".no-build").text("oops! we received status #{err.status}")
      $(".run-commit").text("try again").removeClass("hide")
    success: =>
      $(".no-build").text("running build")

  false

close: ()->
  $(@el).html("")
  console.log "CLOSED VIEW CALLED"
  @.stopListening()
  @.undelegateEvents()
  @.unbind()

repo build detail class Perkins.Views.BuildDetail extends Backbone.View

el: "#build-report-container"

initialize: (opts={})->
  @repo = opts.repo
  window.current_repo = @repo
  @build = opts.build

template: ->
  JST["repos/report_detail"]({repo: @repo.toJSON(), build: @build.toJSON()})

render: ->
  $(@el).html(@template())
  window.log_view = new LogView(el: "#log")
  log_view.render()
  @displayRestartBuildBtn()
  $("#no-build-warning").addClass("hide")

displayRestartBuildBtn: ->
  $("#restart-build-btn").removeClass("hide")
  #url = "/repos/#{@repo.get('name')}/builds/#{@build.id}/restart"
  #$("#restart-build-btn").find("a").attr("href", url )

restart: ->
  $("#restart-build-btn").find("i").addClass("fa-spin")
  @build.restart()
  @pulse
  false

pulse: ->
  setTimeout ()=>
    @build.fetch()
    @pulse() unless @build.isStopped()
  , 700

close: ()->
  $(@el).html("")
  console.log "CLOSED VIEW CALLED"
  @.stopListening()
  @.undelegateEvents()
  @.unbind()

#REPO BUILDS class Perkins.Views.RepoBuilds extends Backbone.View

initialize: (opts={})->
  @repo = opts.model
  window.current_repo = @repo
  @builds = new Perkins.Collections.BuildReports(repo: @repo)

el: "#main-content"

template: ->
  JST["repos/builds"]({repo: @repo.toJSON() , builds: @builds})

render: ->
  console.log("render repo builds")
  $(@el).html(@template())
  @builds_view = new Perkins.Views.RepoBuildCollection(collection: @builds)
  @builds.fetch()

close: ()->
  $(@el).html("")
  console.log "CLOSED VIEW CALLED"
  @.stopListening()
  @.undelegateEvents()
  @.unbind()

class Perkins.Views.RepoBuildItem extends Backbone.Marionette.ItemView

tagName: "tr"

template: (serialized_model) ->
  JST['repos/build_row'](serialized_model)

class Perkins.Views.RepoBuildCollection extends Backbone.Marionette.CollectionView

itemView: Perkins.Views.RepoBuildItem
el: "#repo-builds"

#REPO CONFIG

class Perkins.Views.RepoConfig extends Backbone.View

el: "#main-content"

events:
  "submit #add-hook" : "submitForm"

initialize: (opts={})->
  @repo = opts.model
  window.current_repo = @repo
  @hook = new Perkins.Models.RepoHook(repo: @repo)

  @listenTo(@hook, "error", @defaultErrorHandler)

template: ->
  JST["repos/config"]({repo: @model.toJSON(), hook: @hook.toJSON() })

render: ->
  console.log("render repo builds")
  @hook.fetch
    success: (res)=>
      $(@el).html(@template())

submitForm: (e)->
  target = $(e.currentTarget)

  $.ajax 
    url: target.attr("action")
    method: "POST"
  .success ()=>
    Backbone.history.navigate("#{@repo.get('name')}/config")

  false
close: ()->
  $(@el).html("")
  console.log "CLOSED VIEW CALLED"
  @.stopListening()
  @.undelegateEvents()
  @.unbind()

defaultErrorHandler: (model, error)=>
  unless error.status < 500
    error_view.render(status: error.status)