<?php

class StarterBlog_Posts_Layout {
	public $args = array();
	public $customizer_args = array();
	public $entry_class = '';

	function set_args( $customizer_args = array() ) {
		$args = array(
			'layout'              => StarterBlog()->get_setting( $customizer_args['prefix'] . '_layout' ),
			'excerpt_type'        => StarterBlog()->get_setting( $customizer_args['prefix'] . '_excerpt_type' ),
			'excerpt_length'      => StarterBlog()->get_setting( $customizer_args['prefix'] . '_excerpt_length' ),
			'excerpt_more'        => StarterBlog()->get_setting( $customizer_args['prefix'] . '_excerpt_more' ),
			'more_text'           => StarterBlog()->get_setting( $customizer_args['prefix'] . '_more_text' ),
			'more_display'        => StarterBlog()->get_setting( $customizer_args['prefix'] . '_more_display' ),
			'thumbnail_size'      => StarterBlog()->get_setting( $customizer_args['prefix'] . '_thumbnail_size' ),
			'hide_thumb_if_empty' => StarterBlog()->get_setting( $customizer_args['prefix'] . '_hide_thumb_if_empty' ),
			'meta_config'         => StarterBlog()->get_setting( $customizer_args['prefix'] . '_meta_config' ),
			'meta_sep'            => StarterBlog()->get_setting( $customizer_args['prefix'] . '_meta_sep' ),
			'author_avatar'       => StarterBlog()->get_setting( $customizer_args['prefix'] . '_author_avatar' ),
			'media_hide'          => StarterBlog()->get_setting( $customizer_args['prefix'] . '_media_hide' ),
		);

		$size = StarterBlog()->get_setting( $customizer_args['prefix'] . '_avatar_size' );
		if ( is_array( $size ) && isset( $size['value'] ) ) {
			$args['avatar_size'] = absint( $size['value'] );
		}

		$pagination = array(
			'show_paging' => StarterBlog()->get_setting( $customizer_args['prefix'] . '_pg_show_paging' ),
			'show_nav'    => StarterBlog()->get_setting( $customizer_args['prefix'] . '_pg_show_nav' ),
			'mid_size'    => StarterBlog()->get_setting( $customizer_args['prefix'] . '_pg_mid_size' ),
			'prev_text'   => StarterBlog()->get_setting( $customizer_args['prefix'] . '_pg_prev_text' ),
			'next_text'   => StarterBlog()->get_setting( $customizer_args['prefix'] . '_pg_next_text' ),
		);

		$args['pagination']    = is_array( $pagination ) ? $pagination : array();
		$this->customizer_args = $customizer_args;

		$_args = wp_parse_args(
			$args,
			array(
				'layout'              => '',
				'columns'             => '',
				'excerpt_length'      => '',
				'excerpt_more'        => '',
				'more_text'           => '',
				'more_display'        => 1,
				'thumbnail_size'      => '',
				'hide_thumb_if_empty' => 1,
				'pagination'          => array(),
				'meta_config'         => array(),
				'meta_sep'            => null,
			)
		);

		if ( ! $_args['layout'] || is_array( $_args['layout'] ) ) {
			$_args['layout'] = 'blog_classic';
		}

		$_args['pagination'] = wp_parse_args(
			$_args['pagination'],
			array(
				'show_paging' => 1,
				'show_number' => 1,
				'show_nav'    => 1,
				'prev_text'   => '',
				'next_text'   => '',
				'mid_size'    => 3,
			)
		);

		if ( ! $_args['columns'] ) {
			$c = $this->get_predefined( $_args['layout'] );
			if ( $c ) {
				$_args['columns'] = $c['columns'];
			}
		}

		$_args['columns'] = absint( $_args['columns'] );
		if ( $_args['columns'] < 1 ) {
			$_args['columns'] = 1;
		}
		if ( ( ! isset( $args['columns'] ) || ! $args['columns'] ) && 'blog_masonry' == $_args['layout'] ) {
			$_args['columns'] = 3;
		}

		if ( in_array( $_args['layout'], array( 'blog_lateral', 'blog_classic' ) ) ) { // phpcs:ignore
			$_args['columns'] = 1;
		}

		$_args['pagination']['mid_size'] = absint( $_args['pagination']['mid_size'] );

		if ( empty( $_args['meta_config'] ) ) {
			$_args['meta_config'] = array(
				array(
					'_key' => 'author',
				),
				array(
					'_key' => 'date',
				),
				array(
					'_key' => 'categories',
				),
				array(
					'_key' => 'comment',
				),
			);
		}

		$this->args = $_args;

		$this->args['header_fields'] = array(
			array(
				'_visibility' => '',
				'_key'        => 'title',
			),
			array(
				'_key'        => 'meta',
				'_visibility' => '',
			),
		);

		$this->args['body_fields']   = array(
			array(
				'_key'        => 'excerpt',
				'_visibility' => '',
			),
		);
		$this->args['footer_fields'] = array(
			array(
				'_key'        => 'readmore',
				'_visibility' => '',
			),
		);
		$this->args['media_fields']  = array();

		if ( isset( $this->customizer_args['_overwrite'] ) ) {
			$this->args = array_merge( $this->args, $this->customizer_args['_overwrite'] );
		}

		StarterBlog_Post_Entry()->set_config( $this->args );
	}


	function has_only_field( $fields, $field = 'category' ) {
		$check = false;
		$n     = 0;
		$c     = false;
		foreach ( (array) $fields as $item ) {
			$item = wp_parse_args(
				$item,
				array(
					'_key'        => '',
					'_visibility' => '',
				)
			);
			if ( 'hidden' !== $item['_visibility'] ) {
				$n ++;
				if ( $item['_key'] == $field ) {
					$c = true;
				}
			}
		}

		if ( $c && $n < 2 ) {
			$check = true;
		} else {
			$check = false;
		}

		return $check;
	}

	function count_item_visibility( $fields ) {
		$n = 0;
		foreach ( (array) $fields as $item ) {
			$item = wp_parse_args(
				$item,
				array(
					'_key'        => '',
					'_visibility' => '',
				)
			);
			if ( 'hidden' !== $item['_visibility'] ) {
				$n ++;
			}
		}

		return $n;
	}

	function item_part( $part = '', $post = null, $inner_class = '' ) {

		$n = $this->count_item_visibility( $this->args[ $part . '_fields' ] );

		if ( isset( $this->args[ $part . '_fields' ] ) && $n > 0 ) {
			if ( 'media' == $part && $this->has_only_field( $this->args[ $part . '_fields' ] ) ) {
				StarterBlog_Post_Entry()->build_fields( $this->args[ $part . '_fields' ], $post );
			} else {
				$only_more = $this->has_only_field( $this->args[ $part . '_fields' ], 'readmore' );
				$classes   = array();
				$classes[] = 'entry-article-part entry-article-' . $part;
				if ( $only_more ) {
					$classes[] = 'only-more';
				}
				echo '<div class="' . esc_attr( join( ' ', $classes ) ) . '">';
				if ( $inner_class ) {
					echo '<div class="' . esc_attr( $inner_class ) . '">';
				}
				StarterBlog_Post_Entry()->build_fields( $this->args[ $part . '_fields' ], $post );
				if ( $inner_class ) {
					echo '</div>';
				}
				echo '</div>';
			}
		}
	}

	function layout( $post = null ) {
		$media_fields = array(
			array(
				'_key' => 'thumbnail',
			),
		);

		if ( $this->args['media_hide'] ) {
			$show_media = false;
		} else {
			$show_media = true;
			if ( ! has_post_thumbnail( $post ) ) {
				if ( $this->args['hide_thumb_if_empty'] ) {
					$show_media = false;
				}
			}
		}

		switch ( $this->args['layout'] ) {
			case 'blog_column':
				$this->item_part( 'header', $post );
				if ( $show_media && $this->count_item_visibility( $this->args['header_fields'] ) ) {
					?>
					<div class="entry-article-part entry-media">
						<a class="entry-media-link " href="<?php echo esc_url( get_permalink( $post ) ); ?>" title="<?php the_title_attribute(); ?>" rel="bookmark"></a>
						<?php
						StarterBlog_Post_Entry()->build_fields( $media_fields, $post );
						$this->item_part( 'media', $post, 'media-content-inner' );
						?>
					</div>
				<?php } ?>
				<div class="entry-content-data">
					<?php
					$this->item_part( 'body', $post );
					$this->item_part( 'footer', $post );
					?>
				</div>
				<?php
				break;
			default:
				if ( $show_media && $this->count_item_visibility( $this->args['header_fields'] ) ) {
					?>
					<div class="entry-media">
						<a class="entry-media-link " href="<?php echo esc_url( get_permalink( $post ) ); ?>" title="<?php the_title_attribute(); ?>" rel="bookmark"></a>
						<?php
						StarterBlog_Post_Entry()->build_fields( $media_fields, $post );
						$this->item_part( 'media', $post, 'media-content-inner' );
						?>
					</div>
				<?php } ?>
				<div class="entry-content-data">
					<?php
					$this->item_part( 'header', $post );
					$this->item_part( 'body', $post );
					$this->item_part( 'footer', $post );
					?>
				</div>
				<?php

		}

	}

	function blog_item( $post = null, $class = null ) {
		$entry_class = array( 'entry' );

		if ( is_numeric( $this->args['columns'] ) && $this->args['columns'] > 1 ) {
			$entry_class[] = 'starterblog-col';
		} elseif ( is_array( $this->args['columns'] ) ) {
			$entry_class[] = 'starterblog-col';
		}
		if ( $class ) {
			$entry_class[] = $class;
		}
		if ( $this->entry_class ) {
			$entry_class[] = $this->entry_class;
		}

		$key = 'loop';
		if ( is_single() ) {
			$key = 'single';
		}

		StarterBlog_Post_Entry()->set_post( $post );
		/**
		 * Hook before each post
		 *
		 * @since 0.2.0
		 */
		do_action( "starterblog/before-post/{$key}" );
		?>
		<article <?php post_class( join( ' ', $entry_class ), $post ); ?>>
			<div class="entry-inner">
				<?php
				$this->layout( $post );
				?>
			</div>
		</article><!-- /.entry post -->
		<?php
		/**
		 * Hook after each post
		 *
		 * @since 0.2.0
		 */
		do_action( "starterblog/after-post/{$key}" );
	}

	function get_predefined( $layout ) {
		if ( ! is_string( $layout ) ) {
			return false;
		}
		$presets = array(
			'blog_classic' => array(
				'columns'    => 1,
				'pagination' => array(),
			),

			'blog_lateral' => array(
				'columns'    => 1,
				'pagination' => array(),
			),

			'blog_boxed' => array(
				'columns'    => 2,
				'pagination' => array(),
			),

		);

		if ( ! empty( $layout ) ) {
			if ( isset( $presets[ $layout ] ) && $presets[ $layout ] ) {
				return $presets[ $layout ];
			}
		}

		return false;
	}

	function render( $customizer_args = array() ) {
		$this->set_args( $customizer_args );
		$classes = array();

		$atts = array();
		if ( is_numeric( $this->args['columns'] ) && $this->args['columns'] > 1 ) {
			$classes['grid']  = 'starterblog-grid-' . $this->args['columns'];
			$atts['data-col'] = $this->args['columns'];
		} elseif ( is_array( $this->args['columns'] ) ) {
			$this->args['columns'] = wp_parse_args(
				$this->args['columns'],
				array(
					'desktop' => 1,
					'tablet'  => 1,
					'mobile'  => 1,
				)
			);
			foreach ( $this->args['columns'] as $d => $v ) {
				$v = absint( $v );
				if ( $v < 1 ) {
					$v = 1;
				} elseif ( $v > 12 ) {
					$v = 12;
				}
				$this->args['columns'][ $d ] = $v;
				$atts[ 'data-col-' . $d ]    = $v;
			}
			$classes['grid'] = sprintf( 'starterblog-grid-%1$s_sm-%2$s_xs-%3$s', $this->args['columns']['desktop'], $this->args['columns']['tablet'], $this->args['columns']['mobile'] );
		}

		$classes[] = 'posts-layout';
		$classes[] = 'layout--' . $this->args['layout'];

		$s_atts = '';
		foreach ( $atts as $k => $v ) {
			$s_atts .= " {$k}='" . esc_attr( $v ) . "' ";
		}
		do_action( 'starterblog/blog/before-render', $this );
		?>
		<div class="posts-layout-wrapper">
			<div class="<?php echo esc_attr( join( ' ', $classes ) ); ?>"<?php echo $s_atts; // WPCS: XSS OK. ?>>
				<?php
				if ( 'blog_timeline' == $this->args['layout'] ) {
					echo '<div class="time-line"></div>';
				}
				?>
				<?php
				if ( have_posts() ) {
					global $post;
					/* Start the Loop */
					$i = 1;
					while ( have_posts() ) {
						the_post();
						$this->blog_item( $post, ( 0 == $i % 2 ) ? 'even' : 'odd' );
						$i ++;
					}
				} else {
					get_template_part( 'template-parts/content', 'none' );
				}
				?>
			</div>
			<?php
			$this->render_pagination();
			?>
		</div>
		<?php
		do_action( 'starterblog/blog/after-render', $this );
	}

	function render_pagination() {
		if ( ! $this->args['pagination']['show_paging'] ) {
			return;
		}
		$prev_next = true;
		if ( $this->args['pagination']['show_nav'] ) {
			$prev_text = $this->args['pagination']['prev_text'];
			$next_text = $this->args['pagination']['next_text'];
			if ( ! $prev_text ) {
				$prev_text = _x( 'Previous', 'previous set of posts', 'starter-blog' );
			}
			if ( ! $next_text ) {
				$next_text = _x( 'Next', 'next set of posts', 'starter-blog' );
			}
		} else {
			$prev_text = false;
			$next_text = false;
			$prev_next = false;
		}

		the_posts_pagination(
			array(
				'mid_size'  => ( $this->args['pagination']['mid_size'] ) ? 3 : 0,
				'prev_text' => $prev_text,
				'next_text' => $next_text,
				'prev_next' => $prev_next,
			)
		);
	}

}

