<?php
/**
 * Warstwa 9: Diagnostyka dla systemów wsparcia AI (Backend zrzucający do JS).
 *
 * Pobiera ważne dla wsparcia technicznego dane (kraj checkoutu, pluginy modyfikujące wysyłkę,
 * zawartość koszyka) bez ingerowania w samą logikę wtyczki, wrzucając je ukradkiem do `parcselectConfig`.
 *
 * @package ParcelSelector
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'Parcselect_Diagnostics' ) ) {
class Parcselect_Diagnostics {

	/**
	 * Konstruktor. Podpina filtr na zmienne lokalizacyjne frontendu.
	 */
	public function __construct() {
		add_filter( 'parcselect_frontend_config', array( $this, 'inject_diagnostic_data' ) );
	}

	/**
	 * Dodaje pole "diagnostics" do obiektu przesyłanego do `ps-wc-bridge.js`.
	 *
	 * @param array $config Obecna konfiguracja frontendu (licenseActive, mapEngine itp).
	 * @return array Rozszerzona konfiguracja.
	 */
	public function inject_diagnostic_data( $config ) {
		// Only expose diagnostics to logged-in admins — prevents plugin list leak to frontend visitors.
		if ( current_user_can( 'manage_options' ) ) {
			$config['diagnostics'] = array(
				'customerShippingCountry' => $this->get_active_shipping_country(),
				'isMethodGloballyEnabled' => $this->is_method_active(),
				'activeConflictingPlugins'=> $this->get_conflicting_plugins(),
				'cartWeight'              => $this->get_cart_weight(),
				'cartTotal'               => $this->get_cart_total(),
				'assignedZonesCount'      => $this->get_inpost_zones_count(),
			);
		} else {
			$config['diagnostics'] = array(
				'customerShippingCountry' => $this->get_active_shipping_country(),
				'isMethodGloballyEnabled' => $this->is_method_active(),
			);
		}

		return $config;
	}

	/**
	 * Pobiera kraj dostawy zadeklarowany przez klienta w procesie Checkout.
	 */
	private function get_active_shipping_country() {
		if ( ! function_exists( 'WC' ) || ! WC()->customer ) {
			return 'unknown';
		}
		$country = WC()->customer->get_shipping_country();
		if ( empty( $country ) ) {
			$country = WC()->customer->get_billing_country();
		}
		return $country ? $country : 'not_set';
	}

	/**
	 * Ostrzega AI o włączonych tyranach, takich jak wtyczki ukrywające natywną wysyłkę WC.
	 */
	private function get_conflicting_plugins() {
		$suspects = array(
			'flexible-shipping'      => 'WPDesk Flexible Shipping',
			'woocommerce-table-rate' => 'Table Rate Shipping',
			'conditional-shipping'   => 'Conditional Shipping',
			'advanced-shipping'      => 'Advanced Shipping',
		);

		$active_conflicts = array();
		$active_plugins   = (array) get_option( 'active_plugins', array() );

		foreach ( $active_plugins as $plugin_file ) {
			foreach ( $suspects as $slug => $name ) {
				if ( strpos( $plugin_file, $slug ) !== false ) {
					$active_conflicts[] = $name;
				}
			}
		}

		return empty( $active_conflicts ) ? 'none' : $active_conflicts;
	}

	/**
	 * Sprawdza rejestr włączonych/wyłączonych metod w bazie danych Woo.
	 */
	private function is_method_active() {
		$settings = get_option( 'woocommerce_parcselect_inpost_paczkomat_settings' );
		if ( ! is_array( $settings ) ) {
			return 'no (not configured)';
		}
		return isset( $settings['enabled'] ) ? $settings['enabled'] : 'no';
	}

	/**
	 * Pobiera aktualną wagę koszyka, ponieważ może to dyskwalifikować Paczkomat (np > 25kg).
	 */
	private function get_cart_weight() {
		if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
			return 0;
		}
		return WC()->cart->get_cart_contents_weight();
	}

    /**
	 * Pobiera aktualną kwotę koszyka w formacie liczbowym.
	 */
	private function get_cart_total() {
		if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
			return 0;
		}
		return WC()->cart->get_total('edit');
	}

	/**
	 * Skanuje aktywne strefy dostaw w poszukiwaniu InPostu (API PHP).
	 */
	private function get_inpost_zones_count() {
		if ( ! class_exists( 'WC_Shipping_Zones' ) ) {
			return 0;
		}

		$count = 0;
		$zones = WC_Shipping_Zones::get_zones();

		// Dodajemy strefę bazową (ID: 0)
		$zones[] = array( 'zone_id' => 0 );

		foreach ( $zones as $zone_data ) {
			$zone = new WC_Shipping_Zone( $zone_data['zone_id'] );
			$methods = $zone->get_shipping_methods();
			foreach ( $methods as $method ) {
				if ( 'parcselect_inpost_paczkomat' === $method->id && 'yes' === $method->enabled ) {
					$count++;
					break; // Znalazł - przechodzimy do next strefy
				}
			}
		}

		return $count;
	}

}

new Parcselect_Diagnostics();
}
