<?php

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

/**
 * WCV_Store_Cat_List_Walker class.
 *
 * @extends        Walker
 * @class          WCV_Store_Cat_List_Walker
 * @version        1.4.4
 * @package        WCVendors_Pro
 * @subpackage     WCVendors_Pro/includes/walkers
 * @author         Jamie Madden <support@wcvendors.com>
 */
class WCV_Store_Cat_List_Walker extends Walker {

    /**
     * What the class handles.
     *
     * @var string
     */
    public $tree_type = 'product_cat';

    /**
     * DB fields to use.
     *
     * @var array
     */
    public $db_fields = array(
        'parent' => 'parent',
        'id'     => 'term_id',
        'slug'   => 'slug',
    );

    /**
     * Starts the list before the elements are added.
     *
     * @see   Walker::start_lvl()
     * @since 1.4.4
     *
     * @param string $output Passed by reference. Used to append additional content.
     * @param int    $depth  Depth of category. Used for tab indentation.
     * @param array  $args   Will only append content if style argument value is 'list'.
     */
    public function start_lvl( &$output, $depth = 0, $args = array() ) {
        if ( 'list' !== $args['style'] ) {
            return;
        }

        $indent  = str_repeat( "\t", $depth );
        $output .= "$indent<ul class='children'>\n";
    }

    /**
     * Ends the list of after the elements are added.
     *
     * @see   Walker::end_lvl()
     * @since 2.1.0
     *
     * @param string $output Passed by reference. Used to append additional content.
     * @param int    $depth  Depth of category. Used for tab indentation.
     * @param array  $args   Will only append content if style argument value is 'list'.
     */
    public function end_lvl( &$output, $depth = 0, $args = array() ) {
        if ( 'list' !== $args['style'] ) {
            return;
        }

        $indent  = str_repeat( "\t", $depth );
        $output .= "$indent</ul>\n";
    }

    /**
     * Start the element output.
     *
     * @see   Walker::start_el()
     * @since 1.4.4
     *
     * @param string  $output Passed by reference. Used to append additional content.
     * @param object  $cat   The category object.
     * @param int     $depth  Depth of category in reference to parents.
     * @param array   $args   An array of arguments.
     * @param integer $current_object_id The current object ID.
     */
    public function start_el( &$output, $cat, $depth = 0, $args = array(), $current_object_id = 0 ) {

        // Get the vendor category counts.
        $vendor_categories = isset( $args['vendor_categories'] ) ? $args['vendor_categories'] : array();
        $cat_count         = isset( $vendor_categories[ $cat->term_id ]['count'] ) ? $vendor_categories[ $cat->term_id ]['count'] : 0;

        $output .= '<li class="cat-item cat-item-' . $cat->term_id;

        if ( $args['current_category'] === $cat->term_id ) {
            $output .= ' current-cat';
        }

        if ( $args['has_children'] && $args['hierarchical'] ) {
            $output .= ' cat-parent';
        }

        if ( $args['current_category_ancestors'] && $args['current_category'] && in_array( $cat->term_id, $args['current_category_ancestors'], true ) ) {
            $output .= ' current-cat-parent';
        }

        $output .= '"><a href="?vendor_category=' . $cat->slug . '">' . _x( $cat->name, 'product category name', 'wcvendors-pro' ) . '</a>'; // phpcs:ignore

        if ( $args['show_count'] ) {
            $output .= ' <span class="count">(' . $cat_count . ')</span>';
        }
    }

    /**
     * Ends the element output, if needed.
     *
     * @see   Walker::end_el()
     * @since 1.4.4
     * @version 1.7.8
     *
     * @param string $output Passed by reference. Used to append additional content.
     * @param object $cat    The category object.
     * @param int    $depth  Depth of category. Not used.
     * @param array  $args   Only uses 'list' for whether should append to output.
     */
    public function end_el( &$output, $cat, $depth = 0, $args = array() ) {
        $output .= "</li>\n";
    }

    /**
     * Traverse elements to create list from elements.
     *
     * Display one element if the element doesn't have any children otherwise,
     * display the element and its children. Will only traverse up to the max.
     * depth and no ignore elements under that depth. It is possible to set the.
     * max depth to include all depths, see walk() method.
     *
     * This method shouldn't be called directly, use the walk() method instead.
     *
     * @since 1.4.4
     *
     * @param object $element           Data object.
     * @param array  $children_elements List of elements to continue traversing.
     * @param int    $max_depth         Max depth to traverse.
     * @param int    $depth             Depth of current element.
     * @param array  $args              The list of arguments.
     * @param string $output            Passed by reference. Used to append additional content.
     *
     * @return null Null on failure with no changes to parameters.
     */
    public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
        if ( ! $element || ( 0 === $element->count && ! empty( $args[0]['hide_empty'] ) ) ) {
            return;
        }
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }
}
