#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

    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(@model, "change:build_status", @handleSpinnerBtn)

  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()

  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()

  runCommit: ->
    url = "/repos/#{@model.get('name')}/run_commit"
    $.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()
    false

  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
  initialize: (opts={})->
    @repo = opts.model
    window.current_repo = @repo
    @hook = new Perkins.Models.RepoHook(repo: @repo)

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


  el: "#main-content"

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

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

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

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