<?php
/**
 * Gutenberg support
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

// Check if Gutenberg is active
// (the standalone plugin or WP5+)
if ( ! uncode_is_gutenberg_active() ) {
	return;
}

if ( ! class_exists( 'Uncode_Gutenberg' ) ) :

/**
 * Uncode_Gutenberg Class
 */
class Uncode_Gutenberg {

	/**
	 * Construct.
	 */
	public function __construct() {
		// Declare Gutenberg features
		add_action( 'after_setup_theme', array( $this, 'declare_features' ) );

		// Admin scripts
		add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );

		// Front-end scripts
		add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );

		// Editor styles
		add_action( 'admin_head', array( $this, 'editor_styles' ) );

		// Set content width
		add_filter( 'uncode_content_width', array( $this, 'set_content_width' ) );
	}

	/**
	 * Declare Gutenberg features
	 */
	public function declare_features() {
		add_theme_support( 'align-wide' );
		remove_theme_support( 'widgets-block-editor' );
	}

	/**
	 * Admin scripts
	 */
	public function admin_scripts( $hook_suffix ) {
		if ( 'post.php' == $hook_suffix || 'post-new.php' == $hook_suffix ) {
			wp_enqueue_style( 'uncode-gutenberg-admin', get_template_directory_uri() . '/core/inc/compatibility/gutenberg/assets/css/uncode-gutenberg-admin.css', array(), UNCODE_VERSION, 'all' );
		}
	}

	/**
	 * Front-end scripts
	 */
	public function frontend_scripts() {
		global $wp_version;

		$has_blocks = version_compare( $wp_version, '5', '>=' ) ? has_blocks( get_the_ID() ) : gutenberg_post_has_blocks( get_the_ID() );

		if ( $has_blocks || apply_filters( 'uncode_load_gutenberg_css', true ) ) {
			wp_enqueue_style( 'uncode-gutenberg-frontend', get_template_directory_uri() . '/core/inc/compatibility/gutenberg/assets/css/uncode-gutenberg-frontend.css', array(), UNCODE_VERSION, 'all' );
		}
	}

	/**
	 * Set max content width (for oembeds)
	 */
	public function set_content_width( $width ) {
		// Don't change the width when Uncode Core is active
		// We are assuming that with VC active Gutenberg is not in use
		if ( defined( 'UNCODE_IS_CUSTOM_WPB_VC' ) ) {
			return $width;
		}

		return 3000;
	}

	/**
	 * Round width in 12 columns grid
	 */
	private function round_editor_width( $width ) {
		$width = $width ? $width : 800;
		$width = 12 * round( $width / 12 );

		return $width;
	}

	/**
	 * Get col width
	 */
	private function get_col_width( $width, $cols ) {
		switch ( $cols ) {
			case 1:
				$width = ( $width * 8.333333333333332 ) / 100;
				break;

			case 2:
				$width = ( $width * 16.666666666666664 ) / 100;
				break;

			case 3:
				$width = ( $width * 25 ) / 100;
				break;

			case 4:
				$width = ( $width * 33.33333333333333 ) / 100;
				break;

			case 5:
				$width = ( $width * 41.66666666666667 ) / 100;
				break;

			case 6:
				$width = ( $width * 50 ) / 100;
				break;

			case 7:
				$width = ( $width * 58.333333333333336 ) / 100;
				break;

			case 8:
				$width = ( $width * 66.66666666666666 ) / 100;
				break;

			case 9:
				$width = ( $width * 75 ) / 100;
				break;

			case 10:
				$width = ( $width * 83.33333333333334 ) / 100;
				break;

			case 11:
				$width = ( $width * 91.66666666666666 ) / 100;
				break;
		}

		// Remove margin
		$width = $width - 54;

		return round( $width );
	}

	/**
	 * Editor scripts
	 */
	private function calculate_editor_width( $settings ) {
		// Add defaults
		$editor_width = array(
			// wrapper_width = content + sidebar
			// This is also the content width on mobile devices (when the sidebar goes down)
			'wrapper_width' => 1200,
			'width'         => 800, // 1200 with a sidebar of 4
			'type'          => 'px',
		);

		$has_sidebar        = $settings[ 'with_sidebar' ] === true ? true : false;
		$content_width_type = $settings[ 'content_width' ];
		$layout_width       = $settings[ 'layout_width' ][ 'width' ];
		$layout_width_type  = $settings[ 'layout_width' ][ 'type' ];

		if ( 'full' === $content_width_type ) {
			// Full content: % width type of course, and content is 100% on mobile devices
			$editor_width[ 'wrapper_width' ] = '100';
			$editor_width[ 'type' ]          = '%';
			$editor_width[ 'width' ]         = 100;

			if ( $has_sidebar ) {
				$sidebar_size            = $settings[ 'sidebar_size' ] ? $settings[ 'sidebar_size' ] : 0;
				$editor_width[ 'width' ] = ( 100 / 12 ) * ( 12 - $sidebar_size );
			}
		} else if ( 'limit' === $content_width_type && $settings[ 'content_width_limit' ][ 'width' ] ) {
			// Limit width
			$content_width_limit      = $settings[ 'content_width_limit' ][ 'width' ];
			$content_width_limit_type = $settings[ 'content_width_limit' ][ 'type' ];

			// Set editor width type
			$editor_width[ 'type' ] = $content_width_limit_type;

			if ( 'px' === $content_width_limit_type ) {
				// Content cannot be larger than the layout width
				$max_width                       = $content_width_limit > $layout_width && $editor_width === 'px' ? $layout_width : $content_width_limit;
				$max_width                       = $this->round_editor_width( $max_width );
				$editor_width[ 'wrapper_width' ] = $max_width - 72;
				$editor_width[ 'width' ]         = $max_width - 72;

				if ( $has_sidebar ) {
					$max_width               = $max_width - 18; // 18px padding (54px - 36px)
					$sidebar_size            = $settings[ 'sidebar_size' ] ? $settings[ 'sidebar_size' ] : 0;
					$editor_width[ 'width' ] = $this->get_col_width( $max_width, 12 - $sidebar_size );
				}
			} else {
				// % type
				$editor_width[ 'wrapper_width' ] = $content_width_limit;
				$editor_width[ 'width' ]         = 100;

				if ( $has_sidebar ) {
					$sidebar_size            = $settings[ 'sidebar_size' ] ? $settings[ 'sidebar_size' ] : 0;
					$editor_width[ 'width' ] = ( $content_width_limit / 12 ) * ( 12 - $sidebar_size );
				}
			}
		} else {
			// Inherit width
			$editor_width[ 'type' ]          = $layout_width_type;

			if ( 'px' === $layout_width_type ) {
				$layout_width                    = $this->round_editor_width( $layout_width );
				$editor_width[ 'wrapper_width' ] = $layout_width - 72;
				$editor_width[ 'width' ]         = $layout_width - 72;

				if ( $has_sidebar ) {
					$max_width               = $layout_width - 18; // 18px padding (54px - 36px)
					$sidebar_size            = $settings[ 'sidebar_size' ] ? $settings[ 'sidebar_size' ] : 0;
					$editor_width[ 'width' ] = $this->get_col_width( $max_width, 12 - $sidebar_size );
				}

			} else {
				// % type
				$editor_width[ 'wrapper_width' ] = $layout_width;
				$editor_width[ 'width' ]         = 100;

				if ( $has_sidebar ) {
					$sidebar_size            = $settings[ 'sidebar_size' ] ? $settings[ 'sidebar_size' ] : 0;
					$editor_width[ 'width' ] = ( 100 / 12 ) * ( 12 - $sidebar_size );
				}
			}
		}

		return $editor_width;
	}

	/**
	 * Editor scripts
	 */
	public function editor_styles() {
		global $post;

		if ( ! isset( $post ) || ! isset( $post->ID ) ) {
			return;
		}

		// Filter for disabling custom editor styles
		if ( apply_filters( 'uncode_disable_custom_gutenberg_editor_styles', false ) ) {
			return;
		}

		// Define defaults
		$text_color           = '#777';
		$dark_text_color      = '#303133';
		$accent_color         = '#006cff';
		$font_family_base     = '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif';
		$font_family_headings = '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif';
		$default_font_size    = '15';
		$h1_font_size         = '35';
		$h2_font_size         = '29';
		$h3_font_size         = '24';
		$h4_font_size         = '20';
		$h5_font_size         = '17';
		$h6_font_size         = '14';
		$post_type            = isset( $post->post_type ) ? $post->post_type : 'post';

		if ( is_multisite() ) {
			$uncode_option = get_blog_option( get_current_blog_id(), ot_options_id() );
		} else {
			$uncode_option = get_option( ot_options_id() );
		}

		global $front_background_colors;

		if ( is_array( $uncode_option ) && isset( $front_background_colors ) ) {
			// Text color
			if ( isset( $uncode_option[ '_uncode_text_color_light' ] ) ) {
				$cs_text_color_light = $uncode_option[ '_uncode_text_color_light' ];
				$text_color          = isset( $front_background_colors[ $cs_text_color_light ] ) ? $front_background_colors[ $cs_text_color_light ] : $text_color;
			}

			// Dark text color
			if ( isset( $uncode_option[ '_uncode_heading_color_light' ] ) ) {
				$cs_text_color_dark  = $uncode_option['_uncode_heading_color_light'];
				$dark_text_color     = isset( $front_background_colors[ $cs_text_color_dark ] ) ? $front_background_colors[ $cs_text_color_dark ] : $dark_text_color;
			}

			// Accent color
			if ( isset( $uncode_option[ '_uncode_accent_color' ] ) ) {
				$cs_accent_color  = $uncode_option[ '_uncode_accent_color' ];
				$accent_color     = isset( $front_background_colors[ $cs_accent_color ] ) ? $front_background_colors[ $cs_accent_color ] : $accent_color;
			}

			// Get fonts
			$cs_body_font_family    = isset( $uncode_option[ '_uncode_body_font_family' ] ) ? $uncode_option[ '_uncode_body_font_family' ] : $font_family_base;
			$cs_heading_font_family = isset( $uncode_option[ '_uncode_heading_font_family' ] ) ? $uncode_option[ '_uncode_heading_font_family' ] : $font_family_headings;
			$cs_font_fallback       = isset( $uncode_option[ '_uncode_fallback_font' ] ) ? $uncode_option[ '_uncode_fallback_font' ] : '';

			if ( isset( $uncode_option[ '_uncode_font_groups' ] ) ) {
				$fonts = $uncode_option[ '_uncode_font_groups' ];

				if ( ! empty( $fonts ) && is_array( $fonts ) ) {
					foreach ( $fonts as $key => $value ) {
						$font_class = $value[ '_uncode_font_group_unique_id' ];
						$font_name  = urldecode( $value[ '_uncode_font_group' ] );

						if ( $font_name === 'manual' ) {
							$font_name = $value[ '_uncode_font_manual' ];
						}

						if ( strpos( $font_name, ' ' ) > 0 && strpos( $font_name, "'" ) === false && strpos( $font_name, "\"" ) === false ) {
							$font_name = "'" . $font_name . "'";
						}

						if ( $font_class === $cs_body_font_family ) {
							$cs_body_font_family = $font_name;
						}

						if ( $font_class === $cs_heading_font_family ) {
							$cs_heading_font_family = $font_name;
						}

						if ( $font_class === $cs_font_fallback ) {
							$cs_font_fallback = $font_name;
						}
					}
				}
			}

			$font_family_fallback = $cs_font_fallback != '' ? ', ' . $cs_font_fallback : '';
			$font_family_base     = $cs_body_font_family . $font_family_fallback;
			$font_family_headings = $cs_heading_font_family . $font_family_fallback;

			// Font sizes
			$default_font_size = isset( $uncode_option[ '_uncode_font_size' ] ) ? $uncode_option[ '_uncode_font_size' ] : $default_font_size;
			$h1_font_size      = isset( $uncode_option[ '_uncode_heading_h1' ] ) ? $uncode_option[ '_uncode_heading_h1' ] : $h1_font_size;
			$h2_font_size      = isset( $uncode_option[ '_uncode_heading_h2' ] ) ? $uncode_option[ '_uncode_heading_h2' ] : $h2_font_size;
			$h3_font_size      = isset( $uncode_option[ '_uncode_heading_h3' ] ) ? $uncode_option[ '_uncode_heading_h3' ] : $h3_font_size;
			$h4_font_size      = isset( $uncode_option[ '_uncode_heading_h4' ] ) ? $uncode_option[ '_uncode_heading_h4' ] : $h4_font_size;
			$h5_font_size      = isset( $uncode_option[ '_uncode_heading_h5' ] ) ? $uncode_option[ '_uncode_heading_h5' ] : $h5_font_size;
			$h6_font_size      = isset( $uncode_option[ '_uncode_heading_h6' ] ) ? $uncode_option[ '_uncode_heading_h6' ] : $h6_font_size;
		}

		// Line heights
		$default_line_height  = '1.75';
		$headings_line_height = '1.2';

		// Calculate editor width
		$layout_settings   = uncode_get_post_layout_settings( $post, $uncode_option );
		$editor_width_data = $this->calculate_editor_width( $layout_settings );

		// There are two widths:
		//
		// 1. Wrapper Width
		// 		- Content + Sidebar on desktop devices
		// 		- Content width on mobile devices
		//
		// 2. Content Width
		// 		- Content width on desktop devices (with or without a sidebar)
		//
		$wrapper_width = $editor_width_data[ 'wrapper_width' ];
		$content_width = $editor_width_data[ 'width' ];
		$width_type    = $editor_width_data[ 'type' ];

		// Calculate columns width
		$content_mobile_width  = $wrapper_width;
		$content_desktop_width = $content_width;

		if ( 'px' === $width_type ) {
			// 30px padding and borders of blocks
			$content_mobile_width  = $content_mobile_width + 30;
			$content_desktop_width = $content_desktop_width + 30;
		}

		// Wide elements
		$content_mobile_wide_width  = $content_mobile_width * 1.5;
		$content_desktop_wide_width = $content_desktop_width * 1.5;

		ob_start();
		?>

		<style type="text/css" id="uncode-gutenberg-css">
			/* Headings */
			.block-editor .editor-post-title__block .editor-post-title__input,
			.block-editor .wp-block-heading h1,
			.block-editor .wp-block-heading h2,
			.block-editor .wp-block-heading h3,
			.block-editor .wp-block-heading h4,
			.block-editor .wp-block-heading h5,
			.block-editor .wp-block-heading h6 {
				color: <?php echo sanitize_text_field( $dark_text_color ); ?>;
				font-family: <?php echo sanitize_text_field( $font_family_headings ); ?>;
			}

			.block-editor .wp-block-heading h1,
			.block-editor .wp-block-heading h2,
			.block-editor .wp-block-heading h3,
			.block-editor .wp-block-heading h4,
			.block-editor .wp-block-heading h5,
			.block-editor .wp-block-heading h6 {
				line-height: <?php echo sanitize_text_field( $headings_line_height ); ?>;
			}

			.block-editor .editor-post-title__block .editor-post-title__input,
			.block-editor .wp-block-heading h1 {
				font-size: <?php echo sanitize_text_field( $h1_font_size ); ?>px;
			}

			.block-editor .wp-block-heading h2 {
				font-size: <?php echo sanitize_text_field( $h2_font_size ); ?>px;
			}

			.block-editor .wp-block-heading h3 {
				font-size: <?php echo sanitize_text_field( $h3_font_size ); ?>px;
			}

			.block-editor .wp-block-heading h4 {
				font-size: <?php echo sanitize_text_field( $h4_font_size ); ?>px;
			}

			.block-editor .wp-block-heading h5 {
				font-size: <?php echo sanitize_text_field( $h5_font_size ); ?>px;
			}

			.block-editor .wp-block-heading h6 {
				font-size: <?php echo sanitize_text_field( $h6_font_size ); ?>px;
			}

			/* Default text */
			.block-editor .edit-post-visual-editor,
			.block-editor .edit-post-visual-editor p,
			.block-editor textarea.editor-default-block-appender__content {
				font-family: <?php echo sanitize_text_field( $font_family_base ); ?>;
				font-size: <?php echo sanitize_text_field( $default_font_size ); ?>px;
				line-height: <?php echo sanitize_text_field( $default_line_height ); ?>;
				-webkit-font-smoothing: antialiased;
			}

			.block-editor .edit-post-visual-editor a {
				color: <?php echo sanitize_text_field( $dark_text_color ); ?>;
				text-decoration: none;
				transition: color 200ms cubic-bezier(0.785, 0.135, 0.15, 0.86);
			}

			.block-editor .edit-post-visual-editor a:hover {
				color: <?php echo sanitize_text_field( $accent_color ); ?>;
			}

			.block-editor p,
			.block-editor ul,
			.block-editor ol,
			.block-editor .wp-block-pullquote,
			.block-editor .wp-block-quote__citation {
				color: <?php echo sanitize_text_field( $text_color ); ?>;
			}

			.block-editor .wp-block-quote__citation,
			.block-editor .wp-block-quote cite,
			.block-editor .wp-block-quote footer {
				margin-top: 0;
			}

			.block-editor strong,
			.block-editor b {
				color: <?php echo sanitize_text_field( $dark_text_color ); ?>;
			}

			/* Quotes */
			.block-editor .wp-block-cover .wp-block-cover-text {
				font-size: 28px;
			}

			.block-editor .wp-block-quote {
				border-left: 2px solid <?php echo sanitize_text_field( $accent_color ); ?>!important;
				padding-left: 27px;
			}

			.block-editor .wp-block-quote p,
			.block-editor .wp-block-pullquote p {
				color: <?php echo sanitize_text_field( $dark_text_color ); ?>;
				font-size: 18px;
				line-height: 1.75;
			}

			.block-editor .wp-block-quote.is-large p,
			.block-editor .wp-block-quote.is-style-large p {
				font-size: 24px;
			}

			.block-editor .wp-block-quote p:last-child {
				margin-bottom: 0;
			}

			.block-editor .wp-block-pullquote {
				border-width: 2px;
				padding: 27px 0;
			}

			.block-editor .wp-block-pullquote__citation {
				text-transform: none;
			}

			.block-editor .wp-block-pullquote.alignleft,
			.block-editor .wp-block-blockquote.alignleft {
				margin-right: 22.5px;
			}

			.block-editor .wp-block-pullquote.alignright,
			.block-editor .wp-block-blockquote.alignright {
				margin-left: 22.5px;
			}

			/* Separator */
			.block-editor .wp-block-separator {
				clear: both;
			}

			.block-editor .wp-block-separator:not(.is-style-dots) {
				border-bottom: 1px solid #eaeaea !important;
				max-width: none !important;
			}
			.block-editor .wp-block-separator.is-style-wide {
				border-top: 1px solid #eaeaea !important;
			}

			/* Links */
			.block-editor .editor-rich-text__tinymce a {
				color: <?php echo sanitize_text_field( $dark_text_color ); ?>;
				text-decoration: none;
			}

			/* Main column width */
			.block-editor .wp-block {
				max-width: <?php echo sanitize_text_field( $content_mobile_width . $width_type ); ?>;
			}

			/* Width of "wide" blocks */
			.block-editor .wp-block[data-align="wide"] {
				max-width: <?php echo sanitize_text_field( $content_mobile_wide_width . $width_type ); ?>;
			}

			/* Width of "full-wide" blocks */
			.block-editor .wp-block[data-align="full"] {
				max-width: none;
			}

			@media (min-width: 960px) {
				/* Main column width */
				.block-editor .wp-block {
					max-width: <?php echo sanitize_text_field( $content_desktop_width . $width_type ); ?>;
				}

				/* Width of "wide" blocks */
				.block-editor .wp-block[data-align="wide"] {
					max-width: <?php echo sanitize_text_field( $content_desktop_wide_width . $width_type ); ?>;
				}

				/* Width of "full-wide" blocks */
				.block-editor .wp-block[data-align="full"] {
					max-width: none;
				}
			}
		</style>
		<?php

		$style = ob_get_clean();
		echo uncode_switch_stock_string( $style );
	}
}

endif;

return new Uncode_Gutenberg();
