<?php

namespace TablePress\PhpOffice\PhpSpreadsheet\Reader\Xml\Style;

use TablePress\PhpOffice\PhpSpreadsheet\Style\Fill as FillStyles;
use SimpleXMLElement;

class Fill extends StyleBase
{
	public const FILL_MAPPINGS = [
		'fillType' => [
			'solid' => FillStyles::FILL_SOLID,
			'gray75' => FillStyles::FILL_PATTERN_DARKGRAY,
			'gray50' => FillStyles::FILL_PATTERN_MEDIUMGRAY,
			'gray25' => FillStyles::FILL_PATTERN_LIGHTGRAY,
			'gray125' => FillStyles::FILL_PATTERN_GRAY125,
			'gray0625' => FillStyles::FILL_PATTERN_GRAY0625,
			'horzstripe' => FillStyles::FILL_PATTERN_DARKHORIZONTAL, // horizontal stripe
			'vertstripe' => FillStyles::FILL_PATTERN_DARKVERTICAL, // vertical stripe
			'reversediagstripe' => FillStyles::FILL_PATTERN_DARKUP, // reverse diagonal stripe
			'diagstripe' => FillStyles::FILL_PATTERN_DARKDOWN, // diagonal stripe
			'diagcross' => FillStyles::FILL_PATTERN_DARKGRID, // diagoanl crosshatch
			'thickdiagcross' => FillStyles::FILL_PATTERN_DARKTRELLIS, // thick diagonal crosshatch
			'thinhorzstripe' => FillStyles::FILL_PATTERN_LIGHTHORIZONTAL,
			'thinvertstripe' => FillStyles::FILL_PATTERN_LIGHTVERTICAL,
			'thinreversediagstripe' => FillStyles::FILL_PATTERN_LIGHTUP,
			'thindiagstripe' => FillStyles::FILL_PATTERN_LIGHTDOWN,
			'thinhorzcross' => FillStyles::FILL_PATTERN_LIGHTGRID, // thin horizontal crosshatch
			'thindiagcross' => FillStyles::FILL_PATTERN_LIGHTTRELLIS, // thin diagonal crosshatch
		],
	];

	/** @return array{
	 *      fill?: array{
	 *          endColor?: array{rgb:string},
	 *          startColor?: array{rgb:string},
	 *          fillType?: string,
	 *      }
	 *   }
	 */
	public function parseStyle(SimpleXMLElement $styleAttributes): array
	{
		/** @var array{
		 *      fill?: array{
		 *          endColor?: array{rgb:string},
		 *          startColor?: array{rgb:string},
		 *          fillType?: string,
		 *      }
		 *  }
		 */
		$style = [];

		foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValuex) {
			$styleAttributeValue = (string) $styleAttributeValuex;
			switch ($styleAttributeKey) {
				case 'Color':
					$style['fill']['endColor']['rgb'] = (string) substr($styleAttributeValue, 1);
					$style['fill']['startColor']['rgb'] = (string) substr($styleAttributeValue, 1);

					break;
				case 'PatternColor':
					$style['fill']['startColor']['rgb'] = (string) substr($styleAttributeValue, 1);

					break;
				case 'Pattern':
					$lcStyleAttributeValue = strtolower((string) $styleAttributeValue);
					$style['fill']['fillType']
						= self::FILL_MAPPINGS['fillType'][$lcStyleAttributeValue] ?? FillStyles::FILL_NONE;

					break;
			}
		}

		return $style;
	}
}
