<?php

namespace DgoraWcas\Engines\WordPressNative;

use DgoraWcas\Post;
use DgoraWcas\Product;
use DgoraWcas\Helpers;
use DgoraWcas\ProductVariation;
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) {
    exit;
}
class DetailsBox {
    public function __construct() {
        if ( defined( 'DGWT_WCAS_WC_AJAX_ENDPOINT' ) ) {
            // Searched result details ajax action
            if ( DGWT_WCAS_WC_AJAX_ENDPOINT ) {
                add_action( 'wc_ajax_' . DGWT_WCAS_RESULT_DETAILS_ACTION, array($this, 'getResultDetails') );
            } else {
                add_action( 'wp_ajax_nopriv_' . DGWT_WCAS_RESULT_DETAILS_ACTION, array($this, 'getResultDetails') );
                add_action( 'wp_ajax_' . DGWT_WCAS_RESULT_DETAILS_ACTION, array($this, 'getResultDetails') );
            }
        }
    }

    /**
     * Get searched result details
     */
    public function getResultDetails() {
        if ( !defined( 'DGWT_WCAS_AJAX_DETAILS_PANEL' ) ) {
            define( 'DGWT_WCAS_AJAX_DETAILS_PANEL', true );
        }
        $output = array();
        $items = array();
        if ( !empty( $_POST['items'] ) && is_array( $_POST['items'] ) ) {
            foreach ( $_POST['items'] as $item ) {
                if ( empty( $item['objectID'] ) ) {
                    continue;
                }
                $suggestionValue = '';
                $postType = '';
                $postID = 0;
                $variationID = 0;
                $termID = 0;
                $taxonomy = '';
                // Suggestion value
                if ( !empty( $item['value'] ) ) {
                    $suggestionValue = sanitize_text_field( $item['value'] );
                }
                $objectID = sanitize_text_field( $item['objectID'] );
                $parts = explode( '__', $objectID );
                $type = ( !empty( $parts[0] ) ? sanitize_key( $parts[0] ) : '' );
                if ( $type === 'taxonomy' ) {
                    $termID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
                    $taxonomy = ( !empty( $parts[2] ) ? sanitize_key( $parts[2] ) : '' );
                } elseif ( $type === 'product' ) {
                    $postType = $type;
                    $postID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
                } elseif ( $type === 'product_variation' ) {
                    $postType = $type;
                    $postID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
                    $variationID = ( !empty( $parts[2] ) ? absint( $parts[2] ) : 0 );
                } elseif ( $type === 'post' ) {
                    $postType = ( !empty( $parts[2] ) ? $parts[2] : 0 );
                    $postID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
                }
                // Get product details
                if ( !empty( $postID ) && !empty( $postType ) && in_array( $postType, array('product', 'product_variation') ) ) {
                    if ( $postType === 'product_variation' ) {
                        $productDetails = $this->getProductDetails( $postID, $variationID );
                    } else {
                        $productDetails = $this->getProductDetails( $postID );
                    }
                    $items[] = array(
                        'objectID' => $objectID,
                        'html'     => $productDetails['html'],
                        'price'    => $productDetails['price'],
                    );
                }
                // Get taxonomy details
                if ( !empty( $termID ) && !empty( $taxonomy ) ) {
                    $items[] = array(
                        'objectID' => $objectID,
                        'html'     => $this->getTaxonomyDetails( $termID, $taxonomy, $suggestionValue ),
                    );
                }
            }
            $output['items'] = $items;
            echo json_encode( apply_filters( 'dgwt/wcas/suggestion_details/output', $output ) );
            die;
        }
    }

    /**
     * Prepare products details to the ajax output
     *
     * @param int $productID
     * @param int $variationID
     *
     * @return array
     */
    private function getProductDetails( $productID, $variationID = 0 ) {
        if ( $variationID ) {
            $product = new ProductVariation($variationID);
            $type = 'product_variation';
        } else {
            $product = new Product($productID);
            $type = 'product';
        }
        $details = array(
            'html'  => '',
            'price' => '',
        );
        if ( !$product->isCorrect() ) {
            return $details;
        }
        $thumbSize = apply_filters( 'dgwt/wcas/suggestion_details/product/thumb_size', 'woocommerce_thumbnail' );
        $responsiveImages = apply_filters( 'dgwt/wcas/suggestion_details/responsive_images', true );
        $wooProduct = $product->getWooObject();
        $vars = array(
            'ID'                => $product->getID(),
            'name'              => $product->getName(),
            'desc'              => $product->getDescription( 'details-panel' ),
            'link'              => apply_filters( "dgwt/wcas/suggestion_details/{$type}/url", $product->getPermalink(), $product ),
            'imageSrc'          => $product->getThumbnailSrc( $thumbSize ),
            'imageSrcset'       => ( $responsiveImages ? $product->getThumbnailSrcset( $thumbSize ) : '' ),
            'imageSizes'        => ( $responsiveImages ? $product->getThumbnailSizes( $thumbSize ) : '' ),
            'sku'               => $product->getSKU(),
            'reviewCount'       => $product->getReviewCount(),
            'ratingHtml'        => $product->getRatingHtml(),
            'priceHtml'         => $product->getPriceHTML(),
            'showQuantity'      => false,
            'stockAvailability' => $product->getStockAvailability(),
            'attributes'        => array(),
            'wooObject'         => $product->getWooObject(),
        );
        if ( $variationID ) {
            $vars['attributes'] = $product->getVariationAttributes();
        }
        if ( ($product->isType( 'simple' ) || $product->isType( 'variation' )) && $wooProduct->is_purchasable() && $wooProduct->is_in_stock() && !$wooProduct->is_sold_individually() && apply_filters( 'dgwt/wcas/suggestion_details/show_quantity', true ) ) {
            $vars['showQuantity'] = true;
        }
        $vars = (object) apply_filters(
            'dgwt/wcas/suggestion_details/product/vars',
            $vars,
            $productID,
            $product
        );
        $file = ( $variationID ? 'product-variation' : 'product' );
        ob_start();
        Helpers::loadTemplate( 'details-panel/' . $file . '.php', $vars );
        $details['html'] = ob_get_clean();
        if ( $variationID ) {
            $details['html'] = apply_filters(
                'dgwt/wcas/suggestion_details/product_variation/html',
                $details['html'],
                $variationID,
                $product
            );
        } else {
            $details['html'] = apply_filters(
                'dgwt/wcas/suggestion_details/product/html',
                $details['html'],
                $productID,
                $product
            );
        }
        $details['price'] = $vars->priceHtml;
        return $details;
    }

    /**
     * Prepare category details to the ajax output
     *
     * @param int $termID
     * @param string taxonomy
     * @param string $termName Suggestion value
     *
     * @return string HTML
     */
    private function getTaxonomyDetails( $termID, $taxonomy, $termName ) {
        $html = '';
        $title = '';
        ob_start();
        $queryArgs = $this->getProductsQueryArgs( $termID, $taxonomy );
        $products = new \WP_Query($queryArgs);
        if ( $products->have_posts() ) {
            $limit = $queryArgs['posts_per_page'];
            $totalProducts = absint( $products->found_posts );
            $showMore = ( $limit > 0 && $totalProducts > 0 && $totalProducts - $limit > 0 ? true : false );
            // Details panel title
            $title .= '<span class="dgwt-wcas-datails-title">';
            $title .= '<span class="dgwt-wcas-details-title-tax">';
            $title .= Helpers::getLabel( 'tax_' . $taxonomy ) . ': ';
            $title .= '</span>';
            $title .= esc_html( wp_unslash( $termName ) );
            $title .= '</span>';
            $title = apply_filters(
                'dgwt/wcas/suggestion_details/taxonomy/headline',
                $title,
                $termID,
                $taxonomy,
                $termName
            );
            echo '<div class="dgwt-wcas-details-inner dgwt-wcas-details-inner-taxonomy dgwt-wcas-details-space">';
            do_action( 'dgwt/wcas/details_panel/term_products/container_before' );
            echo '<div class="dgwt-wcas-products-in-cat">';
            echo ( !empty( $title ) ? $title : '' );
            $thumbSize = apply_filters( 'dgwt/wcas/suggestion_details/term_products/thumb_size', DGWT_WCAS()->setup->getThumbnailSize() );
            $responsiveImages = apply_filters( 'dgwt/wcas/suggestion_details/responsive_images', true );
            while ( $products->have_posts() ) {
                $products->the_post();
                $product = new Product(get_the_ID());
                if ( $product->isValid() ) {
                    $vars = array(
                        'ID'          => $product->getID(),
                        'name'        => $product->getName(),
                        'link'        => apply_filters( 'dgwt/wcas/suggestion_details/term_product/url', $product->getPermalink(), $product ),
                        'imageSrc'    => $product->getThumbnailSrc( $thumbSize ),
                        'imageSrcset' => ( $responsiveImages ? $product->getThumbnailSrcset( $thumbSize ) : '' ),
                        'imageSizes'  => ( $responsiveImages ? $product->getThumbnailSizes( $thumbSize ) : '' ),
                        'reviewCount' => $product->getReviewCount(),
                        'ratingHtml'  => $product->getRatingHtml(),
                        'priceHtml'   => $product->getPriceHTML(),
                        'wooObject'   => $product->getWooObject(),
                    );
                    $vars = (object) apply_filters(
                        'dgwt/wcas/suggestion_details/term_products/vars',
                        $vars,
                        $product->getID(),
                        $product
                    );
                    Helpers::loadTemplate( 'details-panel/term-product.php', $vars );
                }
            }
            echo '</div>';
            if ( $showMore ) {
                $showMoreUrl = get_term_link( $termID, $taxonomy );
                $showMoreUrl = apply_filters( 'dgwt/wcas/suggestion_details/term_products/show_more_url', $showMoreUrl, get_term( $termID, $taxonomy ) );
                echo '<a class="dgwt-wcas-details-more-products" href="' . esc_url( $showMoreUrl ) . '">' . esc_html( Helpers::getLabel( 'show_more_details' ) ) . ' (' . $totalProducts . ')</a>';
            }
            do_action( 'dgwt/wcas/details_panel/term_products/container_after' );
            echo '</div>';
        }
        wp_reset_postdata();
        $html = ob_get_clean();
        return apply_filters(
            'dgwt/wcas/suggestion_details/term/html',
            $html,
            $termID,
            $taxonomy
        );
    }

    /**
     * Get query vars for products that should be displayed in the daxonomy details box
     *
     * @param int $termID
     * @param string $taxonomy
     *
     * @return array
     */
    private function getProductsQueryArgs( $termID, $taxonomy ) {
        $productVisibilityTermIds = wc_get_product_visibility_term_ids();
        $queryArgs = array(
            'posts_per_page' => apply_filters( 'dgwt/wcas/suggestion_details/taxonomy/limit', 4 ),
            'post_status'    => 'publish',
            'post_type'      => 'product',
            'no_found_rows'  => false,
            'order'          => 'desc',
            'orderby'        => 'meta_value_num',
            'meta_key'       => 'total_sales',
            'tax_query'      => array(),
        );
        // Visibility
        $queryArgs['tax_query'][] = array(
            'taxonomy' => 'product_visibility',
            'field'    => 'term_taxonomy_id',
            'terms'    => $productVisibilityTermIds['exclude-from-search'],
            'operator' => 'NOT IN',
        );
        // Out of stock
        if ( 'yes' === get_option( 'woocommerce_manage_stock' ) && DGWT_WCAS()->settings->getOption( 'exclude_out_of_stock' ) === 'on' ) {
            $queryArgs['tax_query'][] = array(
                'taxonomy' => 'product_visibility',
                'field'    => 'term_taxonomy_id',
                'terms'    => $productVisibilityTermIds['outofstock'],
                'operator' => 'NOT IN',
            );
        }
        // Search with specific category
        $queryArgs['tax_query'][] = array(
            'taxonomy'         => $taxonomy,
            'field'            => 'id',
            'terms'            => $termID,
            'include_children' => true,
        );
        return apply_filters(
            'dgwt/wcas/suggestion_details/taxonomy/products_query_args',
            $queryArgs,
            $termID,
            $taxonomy
        );
    }

}
