<?php

namespace OOUI;

class ProgressBarWidget extends Widget {
	/**
	 * @var bool|int
	 */
	protected $progress;

	/**
	 * @var Tag
	 */
	protected $bar;

	/**
	 * @param array $config Configuration options
	 * @param bool|int $config['progress'] Numeric value between 0 and 100 (the percent complete)
	 *     for determinate progress bar, or `false` for indeterminate progress bar (default: false)
	 * @param-taint $config escapes_html
	 */
	public function __construct( array $config = [] ) {
		parent::__construct( $config );

		$this->bar = new Tag( 'div' );
		$this->bar->addClasses( [ 'oo-ui-progressBarWidget-bar' ] );

		$this->setProgress( array_key_exists( 'progress', $config ) ? $config['progress'] : false );

		$this
			->setAttributes( [
				'role' => 'progressbar',
				'aria-valuemin' => 0,
				'aria-valuemax' => 100,
				] )
			->addClasses( [ 'oo-ui-progressBarWidget' ] )
			->appendContent( $this->bar );
	}

	/**
	 * @return bool|int
	 */
	public function getProgress() {
		return $this->progress;
	}

	/**
	 * @param bool|int $progress Numeric value between 0 and 100 (the percent complete)
	 *     for determinate progress bar, or `false` for indeterminate progress bar (default: false)
	 */
	public function setProgress( $progress ) {
		$this->progress = $progress;

		if ( $progress !== false ) {
			$this->bar->setAttributes( [ 'style' => 'width: ' . $this->progress . '%;' ] );
			$this->setAttributes( [ 'aria-valuenow' => $this->progress ] );
		} else {
			$this->removeAttributes( [ 'aria-valuenow' ] );
		}
		$this->toggleClasses( [ 'oo-ui-progressBarWidget-indeterminate' ], $progress === false );
	}

	public function getConfig( &$config ) {
		if ( $this->progress !== null ) {
			$config['progress'] = $this->progress;
		}
		return parent::getConfig( $config );
	}
}
