<?php

defined('ABSPATH') || exit;

/**
 * Adds MC4WP_Widget widget.
 *
 * @ignore
 */
class MC4WP_Form_Widget extends WP_Widget
{
    /**
     * @var array
     */
    private $default_instance_settings = [
        'title'   => '',
        'form_id' => '',
    ];

    /**
     * Register widget with WordPress.
     */
    public function __construct()
    {

        // translate default widget title
        $this->default_instance_settings['title'] = __('Newsletter', 'mailchimp-for-wp');

        parent::__construct(
            'mc4wp_form_widget', // Base ID
            __('Mailchimp Sign-Up Form', 'mailchimp-for-wp'), // Name
            [
                'description' => __('Displays your Mailchimp for WordPress sign-up form', 'mailchimp-for-wp'),
            ]
        );
    }

    /**
     * Front-end display of widget.
     *
     * @see WP_Widget::widget()
     *
     * @param array   $args     Widget arguments.
     * @param array   $instance_settings Saved values from database.
     */
    public function widget($args, $instance_settings)
    {

        // ensure $instance_settings is an array
        if (! is_array($instance_settings)) {
            $instance_settings = [];
        }

        $instance_settings = array_merge($this->default_instance_settings, $instance_settings);
        $title             = apply_filters('widget_title', $instance_settings['title'], $instance_settings, $this->id_base);

        // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Core/theme widget wrappers are trusted HTML.
        echo $args['before_widget'];

        if (! empty($title)) {
            // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Widget title and wrappers intentionally allow filtered markup.
            echo $args['before_title'] . $title . $args['after_title'];
        }

        mc4wp_show_form($instance_settings['form_id']);

        // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Core/theme widget wrappers are trusted HTML.
        echo $args['after_widget'];
    }

    /**
     * Back-end widget form.
     *
     * @see WP_Widget::form()
     *
     * @param array $settings Previously saved values from database.
     *
     * @return string|void
     */
    public function form($settings)
    {
        $settings = array_merge($this->default_instance_settings, (array) $settings); ?>
        <p>
            <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php esc_html_e('Title:', 'mailchimp-for-wp'); ?></label>
            <input class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" type="text" value="<?php echo esc_attr($settings['title']); ?>" />
        </p>


        <?php
        $widget = $this;
        /**
         * Runs right after the widget settings form is outputted
         *
         * @param array $settings
         * @param MC4WP_Form_Widget $widget
         * @ignore
         */
        do_action('mc4wp_form_widget_form', $settings, $widget);
        ?>

        <p class="description">
            <?php
            echo wp_kses(
                sprintf(
                    // translators: %s is the URL to the plugin form settings page.
                    __('You can edit your sign-up form in the <a href="%s">Mailchimp for WordPress form settings</a>.', 'mailchimp-for-wp'),
                    esc_url(admin_url('admin.php?page=mailchimp-for-wp-forms'))
                ),
                [ 'a' => [ 'href' => [] ] ]
            );
            ?>
        </p>
        <?php
    }

    /**
     * Validates widget form values as they are saved.
     *
     * @see WP_Widget::update()
     *
     * @param array   $new_settings Values just sent to be saved.
     * @param array   $old_settings Previously saved values from database.
     *
     * @return array Updated safe values to be saved.
     */
    public function update($new_settings, $old_settings)
    {
        if (! empty($new_settings['title'])) {
            $new_settings['title'] = sanitize_text_field($new_settings['title']);
        }

        /**
         * Filters the widget settings before they are saved.
         *
         * @param array $new_settings
         * @param array $old_settings
         * @param MC4WP_Form_Widget $widget
         * @ignore
         */
        $new_settings = apply_filters('mc4wp_form_widget_update_settings', $new_settings, $old_settings, $this);

        return $new_settings;
    }
}
