<?php

namespace Rapsys\PackBundle\Asset;

use Symfony\Component\Asset\Context\ContextInterface;
use Symfony\Component\Asset\PathPackage;
use Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface;

/**
 * (@inheritdoc)
 */
class PackPackage extends PathPackage {
	//The base path
	protected $basePath;

	/**
	 * {@inheritdoc}
	 */
	public function __construct(string $basePath, VersionStrategyInterface $versionStrategy, ContextInterface $context = null) {
		parent::__construct($basePath, $versionStrategy, $context);

		if (!$basePath) {
			$this->basePath = '/';
		} else {
			if ('/' != $basePath[0]) {
				$basePath = '/'.$basePath;
			}

			$this->basePath = rtrim($basePath, '/').'/';
		}
	}

	/**
	 * @todo Try retrive public dir from the member function BundleNameBundle::getPublicDir() return value ?
	 * @xxx see https://symfony.com/doc/current/bundles.html#overridding-the-bundle-directory-structure
	 * {@inheritdoc}
	 */
	public function getUrl($path) {
		//Match url starting with a bundle name
		if (preg_match('%^@([A-Z][a-zA-Z]*?)(?:Bundle/Resources/public)?/(.*)$%', $path, $matches)) {
			//Handle empty or without replacement pattern basePath
			if (empty($this->basePath) || strpos($this->basePath, '%s') === false) {
				//Set path from hardcoded format
				$path = '/bundles/'.strtolower($matches[1]).'/'.$matches[2];
			//Proceed with basePath pattern replacement
			} else {
				//Set path from basePath pattern
				//XXX: basePath has a trailing / added by constructor
				$path = sprintf($this->basePath, strtolower($matches[1])).$matches[2];
			}
		}

		//Return parent getUrl result
		return parent::getUrl($path);
	}
}