<?php

namespace MailOptin\PmProConnect;

use MailOptin\Core\AsyncHandler\AsyncHandler;
use MailOptin\Core\PluginSettings\Settings;
use MailOptin\Core\Repositories\ConnectionsRepository;

use function MailOptin\Core\is_optin_bg_processing_enabled;
use function MailOptin\Core\moVarGET;
use function MailOptin\Core\moVarPOST;

define('MAILOPTIN_PMPRO_CONNECT_ASSETS_URL', plugins_url('assets/',__FILE__));

class PMPROInit
{
    public function __construct()
    {
        add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts']);

        add_action('pmpro_checkout_before_submit_button', [$this, 'display_signup_field']);

        add_action('pmpro_checkout_before_change_membership_level', [$this, 'save_optin_checkbox_state'], 10, 2);

        add_action('pmpro_after_checkout', [$this, 'hook_callback'], 1, 2);
        add_action('mailoptin_async_handler_job', function ($action, $item) {
            if ('pmpro_process_signup' === $action) call_user_func_array([$this, 'process_signup'], $item);
        }, 10, 2);
    }

    public function enqueue_scripts()
    {
        global $post;

        if (moVarGET('page') == 'pmpro-membershiplevels' && defined('MAILOPTIN_DETACH_LIBSODIUM')) {
            wp_enqueue_script('mailoptin-select2', MAILOPTIN_ASSETS_URL . 'js/customizer-controls/select2/select2.min.js', ['jquery'], false, true);
            wp_enqueue_style('mailoptin-core-select2', MAILOPTIN_ASSETS_URL . 'js/customizer-controls/select2/select2.min.css', null);
        }

        $screen = get_current_screen();

        if ( ! empty($screen->id) && strpos($screen->id, MAILOPTIN_SETTINGS_SETTINGS_SLUG) !== false) {
            wp_enqueue_script('mailoptin-pmpro-settings', MAILOPTIN_PMPRO_CONNECT_ASSETS_URL . 'settings.js', ['jquery'], MAILOPTIN_VERSION_NUMBER, true);
            wp_enqueue_script('mailoptin-select2', MAILOPTIN_ASSETS_URL . 'js/customizer-controls/select2/select2.min.js', ['jquery'], false, true);
            wp_enqueue_style('mailoptin-core-select2', MAILOPTIN_ASSETS_URL . 'js/customizer-controls/select2/select2.min.css', null);
        }
    }

    protected function is_auto_subscribe_enabled()
    {
        return Settings::instance()->mailoptin_pmpro_subscribe_method() != 'yes';
    }

    public function display_signup_field()
    {
        $saved_connections = Settings::instance()->mailoptin_pmpro_integration_connections();

        if ( ! empty($saved_connections) && ! $this->is_auto_subscribe_enabled()) {

            $optin_label = Settings::instance()->mailoptin_pmpro_optin_checkbox_label();

            if ( empty($optin_label)) $optin_label = __('Subscribe to our newsletters', 'mailoptin');

            ?>
            <div class="pmpro_checkout-field  pmpro_checkout-field-checkbox">
                <input name="mopmpro_opt_in" type="checkbox" value="1" id="mopmpro_opt_in" class="input ">
                <label class="pmprorh_checkbox_label" for="mopmpro_opt_in"><?= $optin_label; ?></label>
            </div>
            <?php
        }
    }

    public function save_optin_checkbox_state($user_id, $morder)
    {
        if ( ! $this->is_auto_subscribe_enabled() && moVarPOST('mopmpro_opt_in') == '1') {
            update_option(sprintf('mo_pmpro_subscribed_checked_%s', $morder->code), 'yes');
        }
    }


    /**
     * @param $user_id
     * @param $morder
     *
     * @return true|void
     */
    public function hook_callback($user_id, $morder)
    {
        if (is_optin_bg_processing_enabled()) {
            return AsyncHandler::push_to_queue('pmpro_process_signup', func_get_args());
        }

        $this->process_signup($user_id, $morder);
    }

    public function process_signup($user_id, $morder)
    {
        if ($this->is_auto_subscribe_enabled() || get_option(sprintf('mo_pmpro_subscribed_checked_%s', $morder->code)) == 'yes') {

            delete_option(sprintf('mo_pmpro_subscribed_checked_%s', $morder->code));

            Membership::get_instance()->process_submission($morder);

            PMPROSettings::get_instance()->process_submission($morder);
        }
    }

    public function pmpro_fields()
    {
        $user_fields = [
            ''              => '&mdash;&mdash;&mdash;',
            'ID'            => __('User ID', 'mailoptin'),
            'user_login'    => __('Username', 'mailoptin'),
            'user_nicename' => __('User Nicename', 'mailoptin'),
            'user_url'      => __('Website URL', 'mailoptin'),
            'user_email'    => __('Email address', 'mailoptin'),
            'display_name'  => __('Display Name', 'mailoptin'),
            'nickname'      => __('Nickname', 'mailoptin'),
            'first_name'    => __('First Name', 'mailoptin'),
            'last_name'     => __('Last Name', 'mailoptin'),
            'description'   => __('Biographical Info ', 'mailoptin'),

            'pmpro_bname'    => __('Billing Name', 'mailoptin'),
            'pmpro_bstreet'  => __('Billing Street', 'mailoptin'),
            'pmpro_bcity'    => __('Billing City', 'mailoptin'),
            'pmpro_bstate'   => __('Billing State/Province', 'mailoptin'),
            'pmpro_bzipcode' => __('Billing Postal Code', 'mailoptin'),
            'pmpro_bphone'   => __('Billing Phone Number', 'mailoptin'),
            'pmpro_bcountry' => __('Billing Country', 'mailoptin')
        ];

        $pmpro_custom_fields = pmpro_get_user_fields();

        if ( ! empty($pmpro_custom_fields)) {
            $user_fields = array_merge($user_fields, $this->return_pmpro_fields($pmpro_custom_fields));
        }

        return apply_filters('mo_pmpro_custom_users_mapped_fields', array_unique($user_fields));
    }

    public function return_pmpro_fields($fields)
    {
        $pmpro_fields = [];

        if ( ! empty($fields)) {

            foreach ($fields as $field) {

                if (is_array($field)) {

                    foreach ($field as $item) {

                        if (isset($item->meta_key)) {
                            $pmpro_fields[$item->meta_key] = $item->label;
                        }
                    }

                } elseif (isset($field->meta_key)) {
                    $pmpro_fields[$field->meta_key] = $field->label;
                }
            }
        }

        return $pmpro_fields;
    }

    /**
     * @param $value
     * @param $user_id
     *
     * @return string
     */
    public function get_field_value($value, $user_id, \MemberOrder $morder)
    {
        switch ($value) {
            case 'pmpro_bname':
                return $morder->billing->name;
            case 'pmpro_bstreet':
                return $morder->billing->street;
            case 'pmpro_bcity':
                return $morder->billing->city;
            case 'pmpro_bstate':
                return $morder->billing->state;
            case 'pmpro_bzipcode':
                return $morder->billing->zip;
            case 'pmpro_bphone':
                return $morder->billing->phone;
            case 'pmpro_bcountry':
                return $morder->billing->country;
            default:
                $user = get_userdata($user_id);
                if ($user && $user->exists() && isset($user->$value)) {
                    return $user->$value;
                }
        }

        return '';
    }

    /**
     * @return mixed
     */
    public static function email_service_providers()
    {
        $connections = ConnectionsRepository::get_connections();

        if (defined('MAILOPTIN_DETACH_LIBSODIUM')) {
            $connections['leadbank'] = __('MailOptin Leads', 'mailoptin');
        }

        unset($connections['WebHookConnect']);
        unset($connections['WordPressUserRegistrationConnect']);

        return $connections;
    }

    /**
     * @return self
     */
    public static function get_instance()
    {
        static $instance = null;

        if (is_null($instance)) {
            $instance = new self();
        }

        return $instance;
    }
}