<?php

class Brizy_Editor_UrlBuilder {

	/**
	 * @var Brizy_Editor_Project
	 */
	protected $project;

	/**
	 * @var Brizy_Editor_Post
	 */
	protected $post;

	/**
	 * @var int
	 */
	protected $post_id;

	/**
	 * @var array
	 */
	protected $upload_dir;

	/**
	 * Brizy_Editor_UrlBuilder constructor.
	 *
	 * @param Brizy_Editor_Project|null $project
	 * @param int|null $post_id
	 */
	public function __construct( $project = null, $post_id = null ) {
		$this->post_id    = $post_id;
		$this->upload_dir = Brizy_Admin_UploadDir::getUploadDir( null, true );
	}

	/**
	 * @return Brizy_Admin_UrlIterator
	 */
	public function compiler_url() {
		return Brizy_Config::getCompilerUrls();
	}


	public function application_form_notification_url() {

		$urls = array( Brizy_Config::BRIZY_APPLICATION_FORM_NOTIFICATION_URL );

		return new Brizy_Admin_UrlIterator( $urls );
	}

	/**
	 * @param string $path
	 * @param string $path
	 *
	 * @return string
	 */
	public function plugin_url( $path = '', $__FILE__ = BRIZY_PLUGIN_BASE ) {
		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}
		$string = plugin_dir_url( $__FILE__ );

		return rtrim( $string, "/" ) . $path;
	}

	/**
	 * @param string $path
	 * @param string $path
	 *
	 * @return string
	 */
	public function plugin_path( $path = '' ) {

		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return BRIZY_PLUGIN_PATH . $path;
	}


	/**
	 * @param $post
	 */
	public function set_post_id( $post_id ) {
		$this->post_id = $post_id;
	}

	public function multipass_url() {
		return set_url_scheme( admin_url( 'admin-ajax.php' ) ) . "?action=brizy_multipass_create&client_id=" . Brizy_Config::BRIZY_APPLICATION_FORM_ID;
	}


	public function proxy_url( $end_point ) {

		$params = array();
		if ( $this->post_id ) {
			$params[ Brizy_Editor::prefix( '_post' ) ] = ( (int) $this->post_id );
		}
		// do not move this line
		$params[ Brizy_Editor::prefix() ] = $end_point;

		return add_query_arg( $params, home_url( '/' ) );
	}

	/**
	 * @param string $end_point
	 *
	 * @return string
	 */
//	public function media_proxy_url( $end_point = '' ) {
//
//		$end_point = ltrim( $end_point, "/" );
//
//		return $this->proxy_url( "/media/" . $end_point );
//	}
	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function upload_path( $path = null ) {
		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return wp_normalize_path( $this->upload_dir['basedir'] . $path );
	}

	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function upload_url( $path = null ) {
		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = "/" . ltrim( $path, "/" );
		}

		return $this->upload_dir['baseurl'] . $path;
	}

	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function brizy_upload_path( $path = null ) {

		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = ltrim( $path, '/' );
		}

		return $this->upload_path( sprintf( Brizy_Config::LOCAL_PAGE_ASSET_STATIC_URL, $path ) );
	}

	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function wp_upload_path( $path = null ) {
		if ( $path ) {
			$path = ltrim( $path, '/' );
		}

		return $this->upload_dir['path'] . '/' . $path;
	}

	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function wp_upload_relative_path( $path ) {
		$path = self::cleanPath( $path );
		$path = ltrim( $path, '/' );
		if ( empty( $this->upload_dir['subdir'] ) || $this->upload_dir['subdir'] == '/' ) {
			return $path;
		}

		return ltrim( $this->upload_dir['subdir'] . '/' . $path, '/' );
	}

	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function brizy_upload_relative_path( $path = null ) {
		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = ltrim( $path, '/' );
		}

		return ltrim( sprintf( Brizy_Config::LOCAL_PAGE_ASSET_STATIC_URL, $path ), "/" );
	}


	/**
	 * @param $path
	 *
	 * @return string
	 */
	public function brizy_upload_url( $path = null ) {

		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = ltrim( $path, "/" );
		}

		return $this->upload_url( sprintf( Brizy_Config::LOCAL_PAGE_ASSET_STATIC_URL, $path ) );
	}

	/**
	 * This will return the relative path to the upload dir.
	 * ex: /brizy/pages/3/x.jpg
	 *
	 * @param null $path
	 * @param null $post_id
	 *
	 * @return string
	 */
	public function page_upload_path( $path = null, $post_id = null ) {
		if ( is_null( $post_id ) && $this->post_id ) {
			$post_id = (int) $this->post_id;
		}
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return $this->brizy_upload_path( $post_id . $path );
	}

	public function page_upload_relative_path( $path = null, $post_id = null ) {
		if ( is_null( $post_id ) && $this->post_id ) {
			$post_id = (int) $this->post_id;
		}
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return $this->brizy_upload_relative_path( $post_id . $path );
	}

	/**
	 * @param null $path
	 * @param null $post_id
	 *
	 * @return string
	 */
	public function page_upload_url( $path = null, $post_id = null ) {
		if ( is_null( $post_id ) && $this->post_id ) {
			$post_id = (int) $this->post_id;
		}
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return $this->brizy_upload_url( $post_id . $path );
	}


	/**
	 * @param null $path
	 *
	 * @return string
	 */
	public function editor_asset_path( $path = null ) {
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return $this->brizy_upload_path( 'editor' . $path );
	}

	/**
	 * @param string $path
	 *
	 * @return string
	 */
	public function editor_build_url( $path = '' ) {
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return $this->plugin_url( Brizy_Config::EDITOR_BUILD_RELATIVE_PATH . $path );
	}

	public function plugin_relative_url( $path = '', $__FILE__ = BRIZY_PLUGIN_BASE ) {
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}
		$pluginUrl = $this->plugin_url( $path, $__FILE__ );
		$urlInfo = parse_url( $pluginUrl );

		return $urlInfo['path'];
	}

	/**
	 * @param null $path
	 *
	 * @return string
	 */
	static public function editor_build_path( $path = null ) {
		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = '/' . ltrim( str_replace( array( '/', '\\' ), '/', $path ), '/' );
		}

		return Brizy_Config::EDITOR_BUILD_PATH . $path;
	}

	/**
	 * @param null $path
	 *
	 * @return string
	 */
	public function media_asset_path( $path = null ) {
		if ( $path ) {
			$path = '/' . ltrim( $path, '/' );
		}

		return $this->brizy_upload_path( "media" . $path );
	}

	/**
	 * @param null $path
	 *
	 * @return string
	 */
	public function media_asset_url( $path = null ) {
		if ( $path ) {
			$path = "/" . ltrim( $path, "/" );
		}

		return $this->brizy_upload_url( "media" . $path );
	}

	/**
	 * @param null $path
	 *
	 * @return string
	 */
	public function external_media_url( $path = null ) {
		$path = self::cleanPath( $path );
		if ( $path ) {
			$path = "/" . ltrim( $path, "/" );
		}
		$url = Brizy_Config::MEDIA_IMAGE_URL . $path;
		$urls = array();
		foreach ( Brizy_Config::getEditorBaseUrls() as $baseUrl ) {
			$urls[] = $baseUrl . $url;
		}

		return new Brizy_Admin_UrlIterator( $urls );
	}

	/**
	 * @param null $path
	 *
	 * @return string
	 */
	public function external_custom_file( $uid, $fileName = null ) {
		$result         = [];
		$brizyCloudUrls = Brizy_Config::getEditorBaseUrls();
		foreach ( $brizyCloudUrls as $url ) {
			$result[] = (string) $url . '/customfile/' . $uid . '/' . $fileName;
		}

		return new Brizy_Admin_UrlIterator( $result );
	}

	/**
	 * @param null $path
	 * @param null $template_version
	 *
	 * @return Brizy_Admin_UrlIterator
	 */
	public function external_asset_url( $path = null, $template_version = null ) {
		$path = self::cleanPath( $path );
		if ( is_null( $template_version ) ) {
			$template_version = BRIZY_EDITOR_VERSION;
		}
		if ( $path ) {
			$path = "/" . ltrim( $path, "/" );
		}
		$urls = array();
		foreach ( Brizy_Config::getStaticUrls() as $url ) {
			$urls[] = sprintf( $url . $path, $template_version );
		}

		return new Brizy_Admin_UrlIterator( $urls );
	}

	/**
	 * @param null $template_version
	 *
	 * @return string
	 */
	public function external_fonts_url( $template_version = null ) {

		if ( is_null( $template_version ) ) {
			$template_version = BRIZY_EDITOR_VERSION;
		}
		$url = Brizy_Config::getFontsUrl();

		return sprintf( $url, $template_version );
	}

	public function compiled_project_styles_url() {
		return $this->brizy_upload_url( Brizy_Config::PROJECT_STLYES_FILE_PATH );
	}

	public function compiled_project_styles_path() {
		return $this->brizy_upload_path( Brizy_Config::PROJECT_STLYES_FILE_PATH );
	}

	public function asset_url( $path = '' ) {
		if ( $path ) {
			$path = "/" . ltrim( $path, "/" );
		}
		$urlInfo = parse_url( home_url( $path ) );
		$portPart = "";
		if(isset($urlInfo['port']))
		{
			$portPart=":".$urlInfo['port'];
		}

		return "{$urlInfo['scheme']}://{$urlInfo['host']}{$portPart}{$urlInfo['path']}";
	}

	public function homeUrl( $path = '' ) {
		if ( $path ) {
			$path = "/" . ltrim( $path, "/" );
		}

		return home_url($path);
	}

	static public function cleanPath( $path ) {

		if ( ! $path ) {
			return $path;
		}
		$path = preg_replace( "/\.?\.\//m", '', $path );
		$path = preg_replace( "/(\/+)\.+(\/+)/m", '$1$2', $path );
		$path = preg_replace( "/\.{2,}/m", '/', $path );
		$path = preg_replace( "/\/{2,}/m", '/', $path );

		return $path;
	}
}

