###
 * coffeescript-ui - Coffeescript User Interface System (CUI)
 * Copyright (c) 2013 - 2016 Programmfabrik GmbH
 * MIT Licence
 * https://github.com/programmfabrik/coffeescript-ui, http://www.coffeescript-ui.org
###
CUI.Template.loadTemplateText(require('./ProgressMeter.html'));

class CUI.ProgressMeter extends CUI.DOMElement
	constructor: (opts) ->
		super(opts)

		@__meter = new CUI.Template
			name: "progress-meter"
			map:
				icon: true
				text: true
				fill: true

		@registerTemplate(@__meter)
		if @_state
			@setState(@_state)
		else if @_states.length
			@setState(@_states[0])

	__checkState: (state) ->
		state in @_states or (typeof(state) == "number" and state >= 0 and state <= 100)

	initOpts: ->
		super()

		if not @opts.states
			@opts.states = Object.keys(CUI.defaults.ProgressMeter.states)

		@addOpts
			states:
				check: Array
			state:
				check: (v) =>
					@__checkState(v)
			# css property to set to the current
			# percent fill, filler will be hidden
			# if percent is null
			css_property_percent:
				default: "width"
				check: String
			size:
				default: "auto"
				mandatory: true
				check: ["auto","mini","normal","big"]
			appearance:
				default: "auto"
				mandatory: true
				check: ["auto","normal","important"]
			onUpdate:
				check: Function

		for state in @opts.states
			@addOpt "icon_"+state,
				default: CUI.defaults.ProgressMeter.states[state]
				check: (v) =>
					v instanceof CUI.Icon or CUI.util.isString(v)

	getState: ->
		@__state

	getMeter: ->
		@__meter

	setState: (state) ->

		CUI.util.assert(@__checkState(state), "ProgressMeter.setState", "state needs to be "+@_states.join(",")+" or between 0 and 100.", state: state)
		if typeof(state) == "number"
			state = Math.round(state*100)/100

		if @__state == state
			return

		@__state = state
		if @__state in @_states
			icon = @["_icon_"+@__state]
			if icon instanceof CUI.Icon
				@__meter.replace(icon, "icon")
			else if not CUI.util.isEmpty(icon)
				@__meter.replace(new CUI.Icon(icon: icon), "icon")
			else
				@__meter.empty("icon")
			# console.debug icon, @__state
			@__meter.DOM.setAttribute("state", @__state)
			@__meter.empty("text")

			fill_css = {} #display: ""
			fill_css[@_css_property_percent] = ""
		else
			@__meter.DOM.setAttribute("state", "percent")
			@__meter.empty("icon")
			@__meter.replace(Math.round(@__state)+"%", "text")
			fill_css = {} #display: ""
			fill_css[@_css_property_percent] = @__state+"%"

		CUI.dom.setStyle(@__meter.map.fill, fill_css)
		@_onUpdate?.call(@, @)
		@

CUI.defaults.ProgressMeter =
	states:
		waiting: "fa-hourglass"
		spinning: "svg-spinner cui-spin-stepped"
