<?php
/**
 * Sandra Mars Master — Single Course Access
 *
 * SAFE VERSION.
 * This file controls only access logic for one course.
 * It does NOT style, hide, move or manipulate the PMPro checkout page.
 *
 * Course sales page:
 * /kreiraj-raj-z-univerzumom/
 *
 * Course lessons page:
 * /moj-tecaj/organizacija-casa-dela-in-energije/
 *
 * PMPro level IDs:
 * 5 = full payment
 * 6 = monthly payment
 *
 * @package Sandra_Mars_Master
 */

if (! defined('ABSPATH')) {
    exit;
}

/**
 * Allowed PMPro level IDs for this course.
 */
if (! function_exists('sm_single_course_get_level_ids')) {
    function sm_single_course_get_level_ids() {
        return array(5, 6);
    }
}

/**
 * Sales / registration page URL.
 */
if (! function_exists('sm_single_course_get_sales_url')) {
    function sm_single_course_get_sales_url() {
        return home_url('/kreiraj-raj-z-univerzumom/');
    }
}

/**
 * Course / lessons URL.
 */
if (! function_exists('sm_single_course_get_course_url')) {
    function sm_single_course_get_course_url() {
        return home_url('/moj-tecaj/organizacija-casa-dela-in-energije/');
    }
}

/**
 * Get current request path.
 */
if (! function_exists('sm_single_course_get_request_path')) {
    function sm_single_course_get_request_path() {
        $request_uri = isset($_SERVER['REQUEST_URI'])
            ? wp_unslash($_SERVER['REQUEST_URI'])
            : '';

        return trim((string) parse_url($request_uri, PHP_URL_PATH), '/');
    }
}

/**
 * Check if current request is the course or a child route of the course.
 */
if (! function_exists('sm_single_course_is_course_request')) {
    function sm_single_course_is_course_request() {
        $request_path = sm_single_course_get_request_path();
        $course_path  = 'moj-tecaj/organizacija-casa-dela-in-energije';

        return $request_path === $course_path || 0 === strpos($request_path, $course_path . '/');
    }
}

/**
 * Check if current request is the sales page.
 */
if (! function_exists('sm_single_course_is_sales_request')) {
    function sm_single_course_is_sales_request() {
        return is_page('kreiraj-raj-z-univerzumom');
    }
}

/**
 * Check if a URL is a PMPro checkout URL.
 */
if (! function_exists('sm_single_course_is_checkout_url')) {
    function sm_single_course_is_checkout_url($url) {
        if (empty($url)) {
            return false;
        }

        $url = (string) $url;

        return false !== strpos($url, 'membership-checkout')
            || false !== strpos($url, 'pmpro_level=')
            || false !== strpos($url, 'pmpro_checkout');
    }
}

/**
 * Check if user has a successful paid PMPro order for this course.
 *
 * This keeps pending/manual orders locked.
 */
if (! function_exists('sm_single_course_user_has_success_order')) {
    function sm_single_course_user_has_success_order($user_id = 0) {
        global $wpdb;

        $user_id = $user_id ? absint($user_id) : get_current_user_id();

        if (! $user_id) {
            return false;
        }

        $level_ids = array_map('absint', sm_single_course_get_level_ids());

        if (empty($level_ids)) {
            return false;
        }

        $table_name   = $wpdb->prefix . 'pmpro_membership_orders';
        $placeholders = implode(',', array_fill(0, count($level_ids), '%d'));

        $query_args = array_merge(
            array($user_id),
            $level_ids
        );

        $sql = $wpdb->prepare(
            "
            SELECT id
            FROM {$table_name}
            WHERE user_id = %d
            AND membership_id IN ({$placeholders})
            AND status IN ('success', 'paid')
            ORDER BY id DESC
            LIMIT 1
            ",
            $query_args
        );

        $order_id = $wpdb->get_var($sql);

        return ! empty($order_id);
    }
}

/**
 * Check if user has active PMPro level for this course.
 */
if (! function_exists('sm_single_course_user_has_active_level')) {
    function sm_single_course_user_has_active_level($user_id = 0) {
        $user_id = $user_id ? absint($user_id) : get_current_user_id();

        if (! $user_id) {
            return false;
        }

        $level_ids = sm_single_course_get_level_ids();

        if (function_exists('pmpro_hasMembershipLevel')) {
            return (bool) pmpro_hasMembershipLevel($level_ids, $user_id);
        }

        if (function_exists('pmpro_getMembershipLevelsForUser')) {
            $levels = pmpro_getMembershipLevelsForUser($user_id);

            if (! empty($levels) && is_array($levels)) {
                foreach ($levels as $level) {
                    if (! empty($level->id) && in_array((int) $level->id, $level_ids, true)) {
                        return true;
                    }
                }
            }
        }

        if (function_exists('pmpro_getMembershipLevelForUser')) {
            $level = pmpro_getMembershipLevelForUser($user_id);

            if (! empty($level->id) && in_array((int) $level->id, $level_ids, true)) {
                return true;
            }
        }

        return false;
    }
}

/**
 * Check if a user has access to this course.
 *
 * Admins always have access.
 * Customers need:
 * - active PMPro level 5 or 6
 * - successful/paid order for level 5 or 6
 */
if (! function_exists('sm_single_course_user_has_access')) {
    function sm_single_course_user_has_access($user_id = 0) {
        $user_id = $user_id ? absint($user_id) : get_current_user_id();

        if (! $user_id) {
            return false;
        }

        if (user_can($user_id, 'manage_options')) {
            return true;
        }

        return sm_single_course_user_has_active_level($user_id)
            && sm_single_course_user_has_success_order($user_id);
    }
}

/**
 * Get checkout URL for a PMPro level.
 */
if (! function_exists('sm_single_course_get_checkout_url')) {
    function sm_single_course_get_checkout_url($level_id) {
        $level_id = absint($level_id);

        return add_query_arg(
            'pmpro_level',
            $level_id,
            home_url('/membership-checkout/')
        );
    }
}

/**
 * Get correct redirect after login.
 */
if (! function_exists('sm_single_course_get_login_redirect_url')) {
    function sm_single_course_get_login_redirect_url($user_id = 0) {
        if (sm_single_course_user_has_access($user_id)) {
            return sm_single_course_get_course_url();
        }

        return sm_single_course_get_sales_url();
    }
}

/**
 * Login URL for existing customers.
 */
if (! function_exists('sm_single_course_get_login_url')) {
    function sm_single_course_get_login_url() {
        if (is_user_logged_in()) {
            return sm_single_course_get_course_url();
        }

        $redirect_to = sm_single_course_get_course_url();

        if (get_page_by_path('login-2')) {
            return add_query_arg(
                'redirect_to',
                rawurlencode($redirect_to),
                home_url('/login-2/')
            );
        }

        return wp_login_url($redirect_to);
    }
}

/**
 * Enqueue CSS only for:
 * - sales page
 * - course page
 * - login page
 *
 * IMPORTANT:
 * This does NOT load any checkout CSS or checkout JS.
 */
if (! function_exists('sm_single_course_enqueue_assets')) {
    function sm_single_course_enqueue_assets() {
        if (
            ! sm_single_course_is_course_request()
            && ! sm_single_course_is_sales_request()
            && ! is_page('login-2')
        ) {
            return;
        }

        $css_path = get_template_directory() . '/assets/css/single-course-access.css';

        if (file_exists($css_path)) {
            wp_enqueue_style(
                'sm-single-course-access',
                get_template_directory_uri() . '/assets/css/single-course-access.css',
                array(),
                filemtime($css_path)
            );
        }
    }
}
add_action('wp_enqueue_scripts', 'sm_single_course_enqueue_assets', 35);

/**
 * Render payment options.
 */
if (! function_exists('sm_single_course_render_payment_options')) {
    function sm_single_course_render_payment_options() {
        $full_payment_url = sm_single_course_get_checkout_url(5);
        $monthly_url      = sm_single_course_get_checkout_url(6);
        $login_url        = sm_single_course_get_login_url();

        ob_start();
        ?>

        <div class="sm-single-course-payment-grid">

            <article class="sm-single-course-payment-card sm-single-course-payment-card--gold">
                <span>Enkratno plačilo</span>

                <h3>369 € takoj</h3>

                <p>
                    Najugodnejša možnost. Plačilo urediš v enem znesku in po uspešnem plačilu prejmeš dostop do vseh lekcij programa.
                </p>

                <a class="sm-single-course-button sm-single-course-button--primary" href="<?php echo esc_url($full_payment_url); ?>">
                    Plačam v celoti
                </a>
            </article>

            <article class="sm-single-course-payment-card">
                <span>Mesečno plačilo</span>

                <h3>66 € / mesec</h3>

                <p>
                    V program vstopiš takoj po uspešnem prvem plačilu, plačilo pa je razdeljeno na 6 mesečnih obrokov.
                </p>

                <a class="sm-single-course-button sm-single-course-button--secondary" href="<?php echo esc_url($monthly_url); ?>">
                    Plačam mesečno
                </a>
            </article>

        </div>

        <div class="sm-single-course-login-note">
            <p>Že imaš kupljen dostop?</p>
            <a href="<?php echo esc_url($login_url); ?>">
                Vstopi v lekcije
            </a>
        </div>

        <?php
        return ob_get_clean();
    }
}

/**
 * Render access box.
 */
if (! function_exists('sm_single_course_render_access_box')) {
    function sm_single_course_render_access_box($context = 'sales') {
        $has_access = sm_single_course_user_has_access();
        $course_url = sm_single_course_get_course_url();

        ob_start();
        ?>

        <section class="sm-single-course-box sm-single-course-box--<?php echo esc_attr($context); ?>">
            <span class="sm-single-course-eyebrow">
                Vpis v program
            </span>

            <?php if ($has_access) : ?>

                <h2>
                    Tvoj dostop je aktiven.
                </h2>

                <p>
                    Tvoje plačilo je potrjeno in dostop do programa je odprt. Nadaljuješ lahko neposredno v lekcijah.
                </p>

                <div class="sm-single-course-actions">
                    <a class="sm-single-course-button sm-single-course-button--primary" href="<?php echo esc_url($course_url); ?>">
                        Vstopi v lekcije
                    </a>
                </div>

            <?php else : ?>

                <h2>
                    Izberi način plačila.
                </h2>

                <p>
                    Oba načina plačila odkleneta celoten program, vse lekcije in dostop do vsebin po uspešnem plačilu.
                </p>

                <?php echo sm_single_course_render_payment_options(); ?>

            <?php endif; ?>
        </section>

        <?php
        return ob_get_clean();
    }
}

/**
 * Shortcode for sales page.
 *
 * Use:
 * [sm_kreiraj_raj_dostop]
 */
if (! function_exists('sm_single_course_access_shortcode')) {
    function sm_single_course_access_shortcode() {
        return sm_single_course_render_access_box('sales');
    }
}
add_shortcode('sm_kreiraj_raj_dostop', 'sm_single_course_access_shortcode');

/**
 * Protect the course page.
 */
if (! function_exists('sm_single_course_protect_course_page')) {
    function sm_single_course_protect_course_page() {
        if (is_admin() || wp_doing_ajax()) {
            return;
        }

        if (! sm_single_course_is_course_request()) {
            return;
        }

        if (sm_single_course_user_has_access()) {
            return;
        }

        status_header(200);
        nocache_headers();

        get_header();
        ?>

        <main id="primary" class="site-main sm-single-course-lock">
            <div class="sm-single-course-lock__inner">
                <div class="sm-single-course-lock__header">
                    <span class="sm-single-course-eyebrow">
                        Zaklenjene lekcije
                    </span>

                    <h1>
                        Lekcije so odprte za prijavljene udeleženke z aktivnim dostopom.
                    </h1>

                    <p>
                        Če si dostop že kupila, se prijavi z istim e-mailom, s katerim si opravila nakup. Če še nimaš dostopa, spodaj izberi način plačila.
                    </p>
                </div>

                <?php echo sm_single_course_render_access_box('locked'); ?>
            </div>
        </main>

        <?php
        get_footer();
        exit;
    }
}
add_action('template_redirect', 'sm_single_course_protect_course_page', 5);

/**
 * Redirect successful checkout directly to the course.
 */
if (! function_exists('sm_single_course_pmpro_confirmation_url')) {
    function sm_single_course_pmpro_confirmation_url($confirmation_url, $user_id = 0, $level = null) {
        $level_id = 0;

        if (is_object($level) && ! empty($level->id)) {
            $level_id = absint($level->id);
        } elseif (is_numeric($level)) {
            $level_id = absint($level);
        } elseif (! empty($_REQUEST['pmpro_level'])) {
            $level_id = absint(wp_unslash($_REQUEST['pmpro_level']));
        }

        if (! in_array($level_id, sm_single_course_get_level_ids(), true)) {
            return $confirmation_url;
        }

        $user_id = $user_id ? absint($user_id) : get_current_user_id();

        if ($user_id && sm_single_course_user_has_access($user_id)) {
            return sm_single_course_get_course_url();
        }

        return $confirmation_url;
    }
}
add_filter('pmpro_confirmation_url', 'sm_single_course_pmpro_confirmation_url', 20, 3);

/**
 * Redirect WordPress login.
 */
if (! function_exists('sm_single_course_login_redirect')) {
    function sm_single_course_login_redirect($redirect_to, $requested_redirect_to, $user) {
        if (is_wp_error($user) || empty($user) || ! is_a($user, 'WP_User')) {
            return $redirect_to;
        }

        if (user_can($user, 'manage_options')) {
            return $redirect_to;
        }

        if (! empty($requested_redirect_to) && sm_single_course_is_checkout_url($requested_redirect_to)) {
            return $requested_redirect_to;
        }

        if (! empty($redirect_to) && sm_single_course_is_checkout_url($redirect_to)) {
            return $redirect_to;
        }

        return sm_single_course_get_login_redirect_url($user->ID);
    }
}
add_filter('login_redirect', 'sm_single_course_login_redirect', 99, 3);

/**
 * Redirect WooCommerce login.
 */
if (! function_exists('sm_single_course_woocommerce_login_redirect')) {
    function sm_single_course_woocommerce_login_redirect($redirect, $user) {
        if (! empty($user) && ! is_wp_error($user) && user_can($user, 'manage_options')) {
            return $redirect;
        }

        if (! empty($redirect) && sm_single_course_is_checkout_url($redirect)) {
            return $redirect;
        }

        $user_id = (! empty($user) && ! is_wp_error($user) && ! empty($user->ID)) ? $user->ID : 0;

        return sm_single_course_get_login_redirect_url($user_id);
    }
}
add_filter('woocommerce_login_redirect', 'sm_single_course_woocommerce_login_redirect', 99, 2);

/**
 * Redirect old PMPro account page only.
 */
if (! function_exists('sm_single_course_redirect_legacy_pmpro_pages')) {
    function sm_single_course_redirect_legacy_pmpro_pages() {
        if (is_admin() || wp_doing_ajax()) {
            return;
        }

        $request_path = sm_single_course_get_request_path();

        if ('membership-account' !== $request_path) {
            return;
        }

        if (sm_single_course_user_has_access()) {
            wp_safe_redirect(sm_single_course_get_course_url(), 302);
            exit;
        }

        wp_safe_redirect(sm_single_course_get_sales_url(), 302);
        exit;
    }
}
add_action('template_redirect', 'sm_single_course_redirect_legacy_pmpro_pages', 20);