<?php
/**
 * Plugin Settings Page: Dashboard > Settings > BW Onboarding Guide
 *
 * @package BW_Onboarding_Guide
 */

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

class BW_Settings {

    private static $instance = null;

    public static function get_instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        add_action( 'admin_menu', array( $this, 'add_settings_page' ) );
        add_action( 'admin_init', array( $this, 'register_settings' ) );
    }

    /**
     * Add settings page under Settings menu.
     */
    public function add_settings_page() {
        add_options_page(
            __( 'BW Onboarding Guide', 'bw-onboarding-guide' ),
            __( 'BW Onboarding Guide', 'bw-onboarding-guide' ),
            'manage_options',
            'bw-onboarding-guide',
            array( $this, 'render_settings_page' )
        );
    }

    /**
     * Register settings.
     */
    public function register_settings() {
        // Section: Appearance
        add_settings_section(
            'bw_onboarding_appearance',
            __( 'Appearance', 'bw-onboarding-guide' ),
            array( $this, 'section_appearance_desc' ),
            'bw-onboarding-guide'
        );

        add_settings_field(
            'bw_onboarding_primary_color',
            __( 'Primary Color', 'bw-onboarding-guide' ),
            array( $this, 'render_color_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_appearance',
            array(
                'id'          => 'bw_onboarding_primary_color',
                'description' => __( 'Used for overlay backdrop and button backgrounds.', 'bw-onboarding-guide' ),
            )
        );

        add_settings_field(
            'bw_onboarding_accent_color',
            __( 'Accent Color', 'bw-onboarding-guide' ),
            array( $this, 'render_color_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_appearance',
            array(
                'id'          => 'bw_onboarding_accent_color',
                'description' => __( 'Used for progress indicators and highlights.', 'bw-onboarding-guide' ),
            )
        );

        // Section: Defaults
        add_settings_section(
            'bw_onboarding_defaults',
            __( 'Default Behavior', 'bw-onboarding-guide' ),
            array( $this, 'section_defaults_desc' ),
            'bw-onboarding-guide'
        );

        add_settings_field(
            'bw_onboarding_trigger',
            __( 'Default Trigger', 'bw-onboarding-guide' ),
            array( $this, 'render_select_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_defaults',
            array(
                'id'      => 'bw_onboarding_trigger',
                'options' => array(
                    'first_visit' => __( 'First visit (auto-start)', 'bw-onboarding-guide' ),
                    'manual'      => __( 'Manual (shortcode/JS only)', 'bw-onboarding-guide' ),
                ),
            )
        );

        add_settings_field(
            'bw_onboarding_show_to',
            __( 'Default Audience', 'bw-onboarding-guide' ),
            array( $this, 'render_select_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_defaults',
            array(
                'id'      => 'bw_onboarding_show_to',
                'options' => array(
                    'logged_in'  => __( 'Logged-in users only', 'bw-onboarding-guide' ),
                    'logged_out' => __( 'Logged-out users only', 'bw-onboarding-guide' ),
                    'all'        => __( 'All visitors', 'bw-onboarding-guide' ),
                ),
            )
        );

        add_settings_field(
            'bw_onboarding_allow_restart',
            __( 'Allow Restart', 'bw-onboarding-guide' ),
            array( $this, 'render_checkbox_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_defaults',
            array(
                'id'          => 'bw_onboarding_allow_restart',
                'label'       => __( 'Allow users to restart completed tours', 'bw-onboarding-guide' ),
                'description' => __( 'When enabled, a "Retake Tour" button is available for completed guides.', 'bw-onboarding-guide' ),
            )
        );

        // Section: Advanced
        add_settings_section(
            'bw_onboarding_advanced',
            __( 'Advanced', 'bw-onboarding-guide' ),
            array( $this, 'section_advanced_desc' ),
            'bw-onboarding-guide'
        );

        add_settings_field(
            'bw_onboarding_animation_speed',
            __( 'Animation Speed', 'bw-onboarding-guide' ),
            array( $this, 'render_select_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_advanced',
            array(
                'id'      => 'bw_onboarding_animation_speed',
                'options' => array(
                    '200'  => __( 'Fast (200ms)', 'bw-onboarding-guide' ),
                    '400'  => __( 'Normal (400ms)', 'bw-onboarding-guide' ),
                    '600'  => __( 'Slow (600ms)', 'bw-onboarding-guide' ),
                ),
            )
        );

        add_settings_field(
            'bw_onboarding_overlay_opacity',
            __( 'Overlay Opacity', 'bw-onboarding-guide' ),
            array( $this, 'render_range_field' ),
            'bw-onboarding-guide',
            'bw_onboarding_advanced',
            array(
                'id'          => 'bw_onboarding_overlay_opacity',
                'min'         => 30,
                'max'         => 90,
                'step'        => 5,
                'description' => __( 'Opacity of the dark overlay behind the spotlight (%).', 'bw-onboarding-guide' ),
            )
        );

        // Register all settings
        $settings = array(
            'bw_onboarding_primary_color'  => array( 'sanitize_callback' => 'sanitize_hex_color' ),
            'bw_onboarding_accent_color'   => array( 'sanitize_callback' => 'sanitize_hex_color' ),
            'bw_onboarding_trigger'        => array( 'sanitize_callback' => 'sanitize_text_field' ),
            'bw_onboarding_show_to'        => array( 'sanitize_callback' => 'sanitize_text_field' ),
            'bw_onboarding_allow_restart'  => array( 'sanitize_callback' => array( $this, 'sanitize_checkbox' ) ),
            'bw_onboarding_animation_speed' => array( 'sanitize_callback' => 'absint' ),
            'bw_onboarding_overlay_opacity' => array( 'sanitize_callback' => 'absint' ),
        );

        foreach ( $settings as $key => $args ) {
            register_setting( 'bw_onboarding_settings', $key, $args );
        }
    }

    /**
     * Section descriptions.
     */
    public function section_appearance_desc() {
        echo '<p>' . __( 'Customize the look and feel of your onboarding tours.', 'bw-onboarding-guide' ) . '</p>';
    }

    public function section_defaults_desc() {
        echo '<p>' . __( 'Set default behavior for new guides. These can be overridden per guide.', 'bw-onboarding-guide' ) . '</p>';
    }

    public function section_advanced_desc() {
        echo '<p>' . __( 'Fine-tune animation and overlay settings.', 'bw-onboarding-guide' ) . '</p>';
    }

    /**
     * Render a color picker field.
     */
    public function render_color_field( $args ) {
        $value = get_option( $args['id'], '' );
        printf(
            '<input type="color" id="%1$s" name="%1$s" value="%2$s" class="bw-color-picker">',
            esc_attr( $args['id'] ),
            esc_attr( $value )
        );
        if ( ! empty( $args['description'] ) ) {
            printf( '<p class="description">%s</p>', esc_html( $args['description'] ) );
        }
    }

    /**
     * Render a select field.
     */
    public function render_select_field( $args ) {
        $value = get_option( $args['id'], '' );
        printf( '<select id="%1$s" name="%1$s">', esc_attr( $args['id'] ) );
        foreach ( $args['options'] as $key => $label ) {
            printf(
                '<option value="%s" %s>%s</option>',
                esc_attr( $key ),
                selected( $value, $key, false ),
                esc_html( $label )
            );
        }
        echo '</select>';
    }

    /**
     * Render a checkbox field.
     */
    public function render_checkbox_field( $args ) {
        $value = get_option( $args['id'], '1' );
        printf(
            '<label><input type="checkbox" id="%1$s" name="%1$s" value="1" %2$s> %3$s</label>',
            esc_attr( $args['id'] ),
            checked( $value, '1', false ),
            esc_html( $args['label'] )
        );
        if ( ! empty( $args['description'] ) ) {
            printf( '<p class="description">%s</p>', esc_html( $args['description'] ) );
        }
    }

    /**
     * Render a range/slider field.
     */
    public function render_range_field( $args ) {
        $value = get_option( $args['id'], 70 );
        printf(
            '<input type="range" id="%1$s" name="%1$s" value="%2$s" min="%3$s" max="%4$s" step="%5$s" class="bw-range-input">',
            esc_attr( $args['id'] ),
            esc_attr( $value ),
            esc_attr( $args['min'] ),
            esc_attr( $args['max'] ),
            esc_attr( $args['step'] )
        );
        printf( ' <span class="bw-range-value">%s%%</span>', esc_html( $value ) );
        if ( ! empty( $args['description'] ) ) {
            printf( '<p class="description">%s</p>', esc_html( $args['description'] ) );
        }
    }

    /**
     * Sanitize checkbox.
     */
    public function sanitize_checkbox( $value ) {
        return $value ? '1' : '0';
    }

    /**
     * Render the settings page.
     */
    public function render_settings_page() {
        if ( ! current_user_can( 'manage_options' ) ) {
            return;
        }
        ?>
        <div class="wrap">
            <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>

            <form method="post" action="options.php">
                <?php
                settings_fields( 'bw_onboarding_settings' );
                do_settings_sections( 'bw-onboarding-guide' );
                submit_button();
                ?>
            </form>

            <hr>
            <h2><?php _e( 'Quick Links', 'bw-onboarding-guide' ); ?></h2>
            <p>
                <a href="<?php echo admin_url( 'edit.php?post_type=bw_guide' ); ?>" class="button"><?php _e( 'Manage Guides', 'bw-onboarding-guide' ); ?></a>
                <a href="<?php echo admin_url( 'post-new.php?post_type=bw_guide' ); ?>" class="button"><?php _e( 'Create New Guide', 'bw-onboarding-guide' ); ?></a>
            </p>

            <hr>
            <h2><?php _e( 'Shortcode Usage', 'bw-onboarding-guide' ); ?></h2>
            <p><?php _e( 'Place a "Start Tour" button anywhere on your site:', 'bw-onboarding-guide' ); ?></p>
            <code>[bw_onboarding_guide id="123"]</code>
            <p><?php _e( 'Or trigger via JavaScript:', 'bw-onboarding-guide' ); ?></p>
            <code>bwOnboarding.start(123);</code>
        </div>
        <?php
    }

    /**
     * Get a setting value with fallback.
     */
    public static function get( $key, $default = '' ) {
        return get_option( 'bw_onboarding_' . $key, $default );
    }
}
