
###
  Linespin - Simple Progress Output
###

'use strict'

c = require './color'

class Linespin

  _speed = undefined
  _stdout = process.stdout
  _spin = ['-', '\\', '|', '/']
  _i = 0

  constructor: (@message, @doneMessage, @speed) ->
    @state = 'stopped'
    @message ?= 'Please wait...'
    @doneMessage ?= 'Finished'
    @speed ?= 200

  start: ->
    if @state is 'stopped'
      @state = 'running'
      _stdout.write "\n"
    _spinnerMessage @message
    _continue @

  stop: (message) ->
    @state = 'stopped'
    _reset()
    _lastMessage message || @doneMessage

  pending: (message) ->
    _pendingMessage message

  success: (message) ->
    _successMessage message

  error: (message) ->
    _errorMessage message

  warn: (message) ->
    _warningMessage message

  msg: (message) ->
    _message message

  # Private Methods

  _reset = ->
    _i = 0

  _continue = (_this) ->
    that = _this
    setTimeout ->
      that.start() if that.state is 'running'
    , that.speed

  _spinner = ->
    "#{_spin[_i = (_i+1) % 4]}"

  _prettify = (message, symbol, newline, replace, color1, color2) ->
    color2 ?= color1
    bump = if newline then "\n\n" else "\n"
    override = if replace then "#{c.rewrite}#{c.rewrite}" else c.rewrite
    _stdout.write "#{override}#{c[color1]}[#{symbol}] #{c[color2]}#{message}#{c.reset}#{bump}"

  # Messages
  _spinnerMessage = (message) ->
    _prettify message, _spinner(), false, false, 'yellow', 'blue'

  _lastMessage = (message) ->
    _prettify message, '✓', false, false, 'green', 'blue'

  _successMessage = (message) ->
    _prettify message, '✓', true, true, 'green', 'grey'

  _pendingMessage = (message) ->
    _prettify message, '?', true, false, 'blue', 'white'

  _message = (message) ->
    _prettify message, '•', true, false, 'white'

  _errorMessage = (message) ->
    _prettify message, '!', true, false, 'red'

  _warningMessage = (message) ->
    _prettify message, '!', true, false, 'yellow'

# Export
module.exports = Linespin
