<?php
/**
 * Modal row
 *
 * @package Yuki
 */

use LottaFramework\Customizer\Controls\Background;
use LottaFramework\Customizer\Controls\BoxShadow;
use LottaFramework\Customizer\Controls\ColorPicker;
use LottaFramework\Customizer\Controls\Condition;
use LottaFramework\Customizer\Controls\Radio;
use LottaFramework\Customizer\Controls\Separator;
use LottaFramework\Customizer\Controls\Slider;
use LottaFramework\Customizer\Controls\Tabs;
use LottaFramework\Customizer\GenericBuilder\Row;
use LottaFramework\Facades\AsyncCss;
use LottaFramework\Facades\Css;
use LottaFramework\Facades\CZ;
use LottaFramework\Utils;

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

if ( ! class_exists( 'Yuki_Modal_Row' ) ) {

	class Yuki_Modal_Row extends Row {
		/**
		 * {@inheritDoc}
		 */
		public function enqueue_frontend_scripts() {
			// Add dynamic css for row
			add_filter( 'yuki_filter_dynamic_css', function ( $css ) {
				$fixed = Css::colors( CZ::get( 'yuki_canvas_close_button_color' ), [
					'initial' => '--yuki-modal-action-initial',
					'hover'   => '--yuki-modal-action-hover',
				] );

				if ( CZ::get( 'yuki_canvas_modal_type' ) === 'drawer' ) {
					$fixed['width'] = CZ::get( 'yuki_canvas_drawer_width' );

					$fixed[ ( CZ::get( 'yuki_canvas_drawer_placement' ) === 'left' ) ? 'margin-right' : 'margin-left' ] = 'auto';
				}

				$css['.yuki-off-canvas .yuki-modal-inner'] = array_merge(
					Css::shadow( CZ::get( 'yuki_canvas_modal_shadow' ) ),
					Css::background( CZ::get( 'yuki_canvas_modal_background' ) )
					, $fixed
				);

				$css['.yuki-off-canvas'] = Css::background( CZ::get( 'yuki_canvas_modal_mask' ) );

				return $css;
			} );
		}

		/**
		 * {@inheritDoc}
		 */
		public function beforeRow() {
			$behaviour = 'toggle';

			if ( CZ::get( 'yuki_canvas_modal_type' ) === 'drawer' ) {
				$behaviour = 'drawer-' . CZ::get( 'yuki_canvas_drawer_placement' );
			}

			$attrs = [
				'id'                     => 'yuki-off-canvas-modal',
				'class'                  => 'yuki-off-canvas yuki-modal',
				'data-toggle-behaviour'  => $behaviour,
				'data-hashchange-action' => 'hide',
			];

			$inner_attrs = [
				'class' => 'yuki-modal-inner'
			];

			if ( is_customize_preview() ) {
				$inner_attrs['data-shortcut']          = 'border';
				$inner_attrs['data-shortcut-location'] = 'yuki_header:' . $this->id;
			}

			?>
        <div <?php Utils::print_attribute_string( $attrs ); ?>>
        <div <?php Utils::print_attribute_string( $inner_attrs ); ?>>
                <div class="yuki-modal-actions">
                    <button id="yuki-close-off-canvas-modal"
                            class="yuki-close-modal"
                            data-toggle-target="#yuki-off-canvas-modal"
                            data-toggle-hidden-focus=".yuki-trigger"
                            type="button"
							aria-label="<?php esc_attr_e( 'Close Off-Canvas area', 'yuki' ); ?>"
                    >
                        <i class="fas fa-times"></i>
                    </button>
                </div>
                <div class="yuki-modal-content" data-redirect-focus="#yuki-close-off-canvas-modal">
			<?php
		}

		/**
		 * {@inheritDoc}
		 */
		public function afterRow() {
			echo '</div></div></div>';
		}

		protected function getRowControls() {
			return [
				( new Tabs() )
					->setActiveTab( 'content' )
					->addTab( 'content', __( 'Content', 'yuki' ), $this->getContentControls() )
					->addTab( 'style', __( 'Style', 'yuki' ), $this->getStyleControls() )
			];
		}

		protected function getStyleControls() {
			return [
				( new ColorPicker( 'yuki_canvas_close_button_color' ) )
					->setLabel( __( 'Close Button Color', 'yuki' ) )
					->asyncColors( '.yuki-off-canvas .yuki-modal-inner', array(
						'initial' => '--yuki-modal-action-initial',
						'hover'   => '--yuki-modal-action-hover',
					) )
					->addColor( 'initial', __( 'Initial', 'yuki' ), 'var(--yuki-accent-color)' )
					->addColor( 'hover', __( 'Hover', 'yuki' ), 'var(--yuki-primary-color)' )
				,
				( new Separator() ),
				( new Background( 'yuki_canvas_modal_background' ) )
					->setLabel( __( 'Modal Background', 'yuki' ) )
					->asyncCss( '.yuki-off-canvas .yuki-modal-inner', AsyncCss::background() )
					->setDefaultValue( [
						'type'  => 'color',
						'color' => 'var(--yuki-base-color)',
					] )
				,
				( new Condition() )
					->setCondition( [ 'yuki_canvas_modal_type' => 'drawer' ] )
					->setControls( [
						( new Background( 'yuki_canvas_modal_mask' ) )
							->setLabel( __( 'Modal Mask', 'yuki' ) )
							->asyncCss( '.yuki-off-canvas', AsyncCss::background() )
							->setDefaultValue( [
								'type'  => 'color',
								'color' => 'rgba(0, 0, 0, 0)',
							] )
						,
						( new BoxShadow( 'yuki_canvas_modal_shadow' ) )
							->setLabel( __( 'Modal Shadow', 'yuki' ) )
							->asyncCss( '.yuki-off-canvas .yuki-modal-inner', AsyncCss::shadow() )
							->setDefaultShadow(
								'rgba(44, 62, 80, 0.35)',
								'0px', '0px',
								'70px', '0px', true
							)
						,
					] )
				,
			];
		}

		protected function getContentControls() {
			return [
				( new Radio( 'yuki_canvas_modal_type' ) )
					->setLabel( __( 'Modal Type', 'yuki' ) )
					->setDefaultValue( 'drawer' )
					->buttonsGroupView()
					->setChoices( [
						'modal'  => __( 'Modal', 'yuki' ),
						'drawer' => __( 'Drawer', 'yuki' ),
					] )
				,
				( new Condition() )
					->setCondition( [ 'yuki_canvas_modal_type' => 'drawer' ] )
					->setControls( [
						( new Radio( 'yuki_canvas_drawer_placement' ) )
							->setLabel( __( 'Drawer Placement', 'yuki' ) )
							->setDefaultValue( 'right' )
							->buttonsGroupView()
							->setChoices( [
								'left'  => __( 'Left', 'yuki' ),
								'right' => __( 'Right', 'yuki' ),
							] )
						,
						( new Separator() ),
						( new Slider( 'yuki_canvas_drawer_width' ) )
							->setLabel( __( 'Drawer Width', 'yuki' ) )
							->enableResponsive()
							->asyncCss( '.yuki-off-canvas .yuki-modal-inner', [ 'width' => 'value' ] )
							->setDefaultValue( [
								'desktop' => '500px',
								'tablet'  => '65vw',
								'mobile'  => '90vw',
							] )
							->setOption( 'units', Utils::units_config( [
								[ 'unit' => 'px', 'min' => 0, 'max' => 1000 ],
							] ) )
						,
					] )
				,
			];
		}
	}
}
