<?php
/**
 * MainWP Payment Left For This Month Widget
 *
 * Displays the Payment Left For This Month.
 *
 * @package MainWP/Dashboard
 * @version 4.6
 */

namespace MainWP\Dashboard\Module\CostTracker;

use MainWP\Dashboard\MainWP_UI;
use MainWP\Dashboard\MainWP_Utility;

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

/**
 * Class Cost_Tracker_Payment_Left_This_Month
 *
 * Displays the Payment Left For This Month.
 */
class Cost_Tracker_Payment_Left_This_Month {

    /**
     * Protected static variable to hold the single instance of the class.
     *
     * @var mixed Default null
     */
    protected static $instance = null;

    /**
     * Return the single instance of the class.
     *
     * @return mixed $instance The single instance of the class.
     */
    public static function instance() {
        if ( is_null( static::$instance ) ) {
            static::$instance = new self();
        }
        return static::$instance;
    }

    /**
     * Handle render costs widget.
     */
    public function render() {
        $this->render_widget();
    }

    /**
     * Render widget.
     */
    public function render_widget() {
        ?>
        <div class="mainwp-widget-header">
            <h2 class="ui header handle-drag">
                <?php esc_html_e( 'Payments Left For the Month', 'mainwp' ); ?>
                <div class="sub header">
                <?php esc_html_e( 'See upcoming costs left for this month.', 'mainwp' ); ?>
                </div>
            </h2>
        </div>

        <div class="mainwp-widget-insights-card">
                <?php
                /**
                 * Action: mainwp_module_cost_tracker_widget_top
                 *
                 * Fires at the top of the widget.
                 *
                 * @since 5.0.2
                 */
                do_action( 'mainwp_module_cost_tracker_widget_top', 'payment-left-for-this-month' );
                ?>
                <div id="mainwp-message-zone" style="display:none;" class="ui message"></div>
                <?php
                $this->render_widget_content();
                ?>
                <?php
                /**
                 * Action: mainwp_module_cost_tracker_widget_bottom
                 *
                 * Fires at the bottom of the widget.
                 *
                 * @since 5.0.2
                 */
                do_action( 'mainwp_module_cost_tracker_widget_bottom', 'payment-left-for-this-month' );
                ?>
            </div>
        <div class="mainwp-widget-footer ui four columns stackable grid">
            <div class="column">
            </div>
            <div class="column">
            </div>
        </div>
        <?php
    }

    /**
     * Get widget costs data.
     *
     * @param array $cost_data     Cost data.
     */
    public static function get_costs_widgets_data( $cost_data ) { // phpcs:ignore -- NOSONAR - complex.
        $series_products_price = array();
        $colors                = array();
        $series_data           = array();
        $product_colors        = Cost_Tracker_Admin::get_product_colors();
        $product_types         = Cost_Tracker_Admin::get_product_types();

        if ( is_array( $cost_data ) ) {
            $current_time = time();
            $upcoming1    = strtotime( gmdate( 'Y-m-01 00:00:00', $current_time ) );
            $upcoming2    = strtotime( gmdate( 'Y-m-t 23:59:59', $current_time ) );
            foreach ( $cost_data as $cost ) {

                if ( ! isset( $series_data[ $cost->product_type ] ) ) {
                    $series_data[ $cost->product_type ]           = array(
                        'name' => isset( $product_types[ $cost->product_type ] ) ? esc_js( $product_types[ $cost->product_type ] ) : 'N/A',
                    );
                    $colors[ $cost->product_type ]                = isset( $product_colors[ $cost->product_type ] ) ? $product_colors[ $cost->product_type ] : '';
                    $series_products_price[ $cost->product_type ] = 0;
                }

                $next_rl = $cost->next_renewal;

                if ( $next_rl <= $upcoming1 ) {
                    $next_rl = Cost_Tracker_Admin::get_next_renewal( $upcoming1, $cost->renewal_type, false );
                }

                $next_price = 0;
                while ( $next_rl <= $upcoming2 ) {
                    if ( $next_rl > $upcoming1 && $next_rl <= $upcoming2 ) {
                        $next_price = $cost->price;
                    }
                    $series_products_price[ $cost->product_type ] += $next_price;
                    $next_rl                                       = Cost_Tracker_Admin::get_next_renewal( $next_rl, $cost->renewal_type, false );
                    $next_price                                    = 0;
                }
            }
        }

        $dec = Cost_Tracker_Utility::cost_tracker_format_price( 0, true, array( 'get_decimals' => true ) );
        foreach ( $series_products_price as $product_type => $price ) {
            $series_data[ $product_type ]['data'][] = round( $price, $dec );
        }

        $categories = array( gmdate( 'M' ) );

        $cur_format = Cost_Tracker_Utility::cost_tracker_format_price( 0, true, array( 'get_currency_format' => true ) );
        return array(
            'series'          => array_values( $series_data ),
            'categories'      => array_values( $categories ),
            'colors'          => array_values( $colors ),
            'currency_format' => $cur_format['format'],
            'decimals'        => $cur_format['decimals'],
        );
    }

    /**
     * Method render_widget_content()
     */
    public function render_widget_content() {
        $costs_data = Cost_Tracker_DB::get_instance()->get_summary_data( array( 'sum_data' => 'all' ) );
        $chart_data = static::get_costs_widgets_data( $costs_data );
        ?>
        <?php if ( empty( $costs_data ) ) : ?>
            <?php MainWP_UI::render_empty_element_placeholder( __( 'No Upcoming Payment', 'mainwp' ), '<a href="admin.php?page=CostTrackerAdd">' .  __( 'Add your costs to see remaining payments for this month.', 'mainwp' ) . '</a>', '<em data-emoji=":bar_chart:" class="medium"></em>' ); ?>
        <?php else : ?>
        <div id="mainwp-module-cost-tracker-payment-left-for-this-month-wrapper"></div>
        <script type="text/javascript">
            jQuery( document ).ready( function() {

                let cost_chart_colors = <?php echo wp_json_encode($chart_data['colors'], true ); //phpcs:ignore -- ok. ?>;
                let cost_chart_currency_format = '<?php echo esc_js($chart_data['currency_format']); //phpcs:ignore -- ok. ?>';

                let options = {
                            series: <?php echo wp_json_encode($chart_data['series'], true ); //phpcs:ignore -- ok. ?>,
                            chart: {
                                type: 'bar',
                                height: 350,
                                stacked: true,
                            },
                            plotOptions: {
                                bar: {
                                horizontal: true,
                                dataLabels: {
                                    total: {
                                    enabled: true,
                                    offsetX: 0,
                                    style: {
                                        fontSize: '13px',
                                        fontWeight: 900
                                    }
                                    }
                                }
                                },
                            },
                            xaxis: {
                                categories: <?php echo wp_json_encode($chart_data['categories'], true ); //phpcs:ignore -- ok. ?>,
                                labels: {
                                    formatter: function (value) {
                                        return isNaN(value) ? value : __(cost_chart_currency_format, value ); // to fix month name format.
                                    },
                                    style: {
                                        colors: '#999999',
                                    },
                                },
                            },
                            yaxis:{
                                type: 'string',
                                labels: {
                                    formatter: function (value) {
                                        return isNaN(value) ? value : __(cost_chart_currency_format, value ); // to fix month name format.
                                    },
                                    style: {
                                        colors: '#999999',
                                    },
                                },
                            },
                            fill: {
                                opacity: 1
                            },
                            legend: {
                                show: false
                            },
                            tooltip: {
                                theme: 'dark'
                            },
                            colors: [
                                function ( { value, seriesIndex, dataPointIndex, w } ) {
                                    if (cost_chart_colors[seriesIndex] !== undefined) {
                                        return cost_chart_colors[seriesIndex];
                                    } else {
                                        return "#5ec130";
                                    }
                                }
                            ],
                        };

                let cost_chart = new ApexCharts(document.querySelector("#mainwp-module-cost-tracker-payment-left-for-this-month-wrapper"), options);
                setTimeout(() => {
                    cost_chart.render();
                }, 1000);
            } );
        </script>
        <?php endif; ?>
        <?php
    }
}
