CocoClass = require 'lib/CocoClass'

module.exports = class LoadingScreen extends CocoClass
  progress: 0

  constructor: (canvas) ->
    super()
    @width = canvas.width
    @height = canvas.height
    @stage = new createjs.Stage(canvas)

  subscriptions:
    'level-loader:progress-changed': 'onLevelLoaderProgressChanged'

  show: ->
    @stage.removeChild(@screen) if @screen
    @screen = @makeScreen()
    @stage.addChild(@screen)
    @updateProgressBar()

  hide: ->
    @stage.removeChild(@screen) if @screen
    @screen = null

  makeScreen: ->
    c = new createjs.Container()
    c.addChild(@makeLoadBackground())
    c.addChild(@makeLoadText())
    c.addChild(@makeProgressBar())
    @makeLoadLogo(c)
    c

  makeLoadBackground: ->
    g = new createjs.Graphics()
    g.beginFill(createjs.Graphics.getRGB(30,30,60))
    g.drawRoundRect(0, 0, @width, @height, 0.0)
    s = new createjs.Shape(g)
    s.y = 0
    s.x = 0
    s

  makeLoadLogo: (container) ->
    logoImage = new Image()
    $(logoImage).load =>
      @logo = new createjs.Bitmap logoImage
      @logo.x = @width / 2 - logoImage.width / 2
      @logo.y = 40
      container.addChild @logo
    logoImage.src = "/images/loading_image.png"

  makeLoadText: ->
    size = @height / 10
    text = new createjs.Text("LOADING", "#{size}px Monospace", "#ff7700")
    text.regX = text.getMeasuredWidth() / 2
    text.regY = text.getMeasuredHeight() / 2
    text.x = @width / 2
    text.y = @height / 2
    @text = text
    return text

  makeProgressBar: ->
    BAR_PIXEL_HEIGHT = 20
    BAR_PCT_WIDTH = .75
    pixelWidth = parseInt(@width * BAR_PCT_WIDTH)
    pixelMargin = (@width - (@width * BAR_PCT_WIDTH)) / 2
    barY = 2 * (@height / 3)

    c = new createjs.Container()
    c.x = pixelMargin
    c.y = barY

    g = new createjs.Graphics()
    g.beginFill(createjs.Graphics.getRGB(255,0,0))
    g.drawRoundRect(0,0,pixelWidth, BAR_PIXEL_HEIGHT, 5)
    @progressBar = new createjs.Shape(g)
    c.addChild(@progressBar)

    g = new createjs.Graphics()
    g.setStrokeStyle(2)
    g.beginStroke(createjs.Graphics.getRGB(230,230,230))
    g.drawRoundRect(0,0,pixelWidth, BAR_PIXEL_HEIGHT, 5)
    c.addChild(new createjs.Shape(g))
    c

  onLevelLoaderProgressChanged: (e) ->
    @progress = e.progress
    @updateProgressBar()

  updateProgressBar: ->
    newProg = parseInt((@progress or 0) * 100)
    newProg = ' '+newProg while newProg.length < 4
    @lastProg = newProg
    @text.text = "BUILDING" if @progress is 1
    @progressBar.scaleX = @progress
    @stage.update()

  showReady: ->
    @text.text = 'READY'
    @text.regX = @text.getMeasuredWidth() / 2
    @stage.update()

  destroy: ->
    @stage.canvas = null
    super()