<?php

if (!class_exists("Cwpai_Local_Free_Shipping")) {
    class Cwpai_Local_Free_Shipping
    {
        public function __construct()
        {
            add_action("woocommerce_product_options_shipping", [$this, "cwpai_add_local_zip_field"]);
            add_action("woocommerce_process_product_meta", [$this, "cwpai_save_local_zip_field"], 10, 2);
            add_action("woocommerce_cart_calculate_fees", [$this, "cwpai_apply_free_shipping"], 20);
            add_action('woocommerce_add_to_cart', [$this, 'cwpai_add_to_cart_action']);
        }

        public function cwpai_add_local_zip_field()
        {
            echo '<div class="options_group">';

            woocommerce_wp_text_input([
                "id" => "cwpai_local_zip",
                "label" => __("Local Zip", "codewp"),
                "desc_tip" => "true",
                "description" => __("Enter the local zip code for free shipping.", "codewp"),
            ]);

            echo "</div>";
        }

        public function cwpai_save_local_zip_field($post_id)
        {
            if (isset($_POST["cwpai_local_zip"])) {
                $local_zip = sanitize_text_field($_POST["cwpai_local_zip"]);
                if (!empty($local_zip)) {
                    update_post_meta($post_id, "cwpai_local_zip", $local_zip);
                }
            }
        }

        public function cwpai_apply_free_shipping()
        {
            $customer_zip = WC()->customer->get_shipping_postcode();

            foreach (WC()->cart->get_cart() as $cart_item) {
                $product_id = $cart_item['product_id'];
                $product_local_zip = get_post_meta($product_id, 'cwpai_local_zip', true);

                if ($customer_zip === $product_local_zip) {
                    WC()->cart->add_fee(__('Free Local Shipping', 'codewp'), -WC()->cart->get_shipping_total());
                    $this->cwpai_add_shipping_notice();
                    break;
                }
            }
        }

        public function cwpai_add_shipping_notice() {
            wc_add_notice(__('You are eligible for Free Local Shipping!', 'codewp'), 'success');
        }

        public function cwpai_add_to_cart_action() {
            $this->cwpai_apply_free_shipping();
        }
    }

    new Cwpai_Local_Free_Shipping();
}
?>