/*
Theme Name: GeneratePress Child
Theme URI: https://generatepress.com
Template: generatepress
Author: Tom Usborne
Author URI: https://generatepress.com/about
Description: GeneratePress is a lightweight WordPress theme built with a focus on speed and usability. Performance is important to us, which is why a fresh GeneratePress install adds less than 10kb (gzipped) to your page size. We take full advantage of the block editor (Gutenberg), which gives you more control over creating your content. If you use page builders, GeneratePress is the right theme for you. It is completely compatible with all major page builders, including Beaver Builder and Elementor. Thanks to our emphasis on WordPress coding standards, we can boast full compatibility with all well-coded plugins, including WooCommerce. GeneratePress is fully responsive, uses valid HTML/CSS, and is translated into over 25 languages by our amazing community of users. A few of our many features include 60+ color controls, powerful dynamic typography, 5 navigation locations, 5 sidebar layouts, dropdown menus (click or hover), and 9 widget areas. Learn more and check out our powerful premium version at https://generatepress.com
Tags: two-columns,three-columns,one-column,right-sidebar,left-sidebar,footer-widgets,blog,e-commerce,flexible-header,full-width-template,buddypress,custom-header,custom-background,custom-menu,custom-colors,sticky-post,threaded-comments,translation-ready,rtl-language-support,featured-images,theme-options
Version: 3.6.1.1770993496
Updated: 2026-02-13 14:38:16

*/
// === GABYTAROT: Sala privada por compra de producto WooCommerce ===

function gabytarot_user_bought_product( $product_id ) {
    if ( ! function_exists('wc_customer_bought_product') ) return false;
    if ( ! is_user_logged_in() ) return false;

    $current_user = wp_get_current_user();
    $email = $current_user->user_email;
    $user_id = $current_user->ID;

    return wc_customer_bought_product( $email, $user_id, $product_id );
}

function gabytarot_sala_shortcode( $atts, $content = null ) {
    $atts = shortcode_atts(
        array(
            'product_id' => 0,
            'buy_url'    => '',
            'login_url'  => ''
        ),
        $atts,
        'gabytarot_sala'
    );

    $product_id = intval($atts['product_id']);

    if ( $product_id <= 0 ) {
        return '<p><strong>Error:</strong> Falta product_id en el shortcode.</p>';
    }

    if ( ! is_user_logged_in() ) {
        $login_url = !empty($atts['login_url']) ? esc_url($atts['login_url']) : esc_url( wp_login_url( get_permalink() ) );
        return '<div style="padding:16px;border:1px solid #ddd;border-radius:10px;">
            <p><strong>Esta sala es privada.</strong> Para acceder, inicia sesión con el correo con el que compraste.</p>
            <p><a href="'.$login_url.'">Iniciar sesión</a></p>
        </div>';
    }

    if ( ! gabytarot_user_bought_product( $product_id ) ) {
        $buy_url = !empty($atts['buy_url']) ? esc_url($atts['buy_url']) : esc_url( get_permalink( $product_id ) );
        return '<div style="padding:16px;border:1px solid #ddd;border-radius:10px;">
            <p><strong>Acceso restringido.</strong> Necesitas una sesión activa para entrar.</p>
            <p><a href="'.$buy_url.'">Comprar sesión</a></p>
        </div>';
    }

    return do_shortcode( $content );
}
add_shortcode('gabytarot_sala', 'gabytarot_sala_shortcode');


// Botón "Acceder a la sala" en la página de pedido recibido
function gabytarot_add_sala_button_on_thankyou( $order_id ) {
    if ( ! $order_id ) return;

    $product_id = 0; // <-- PON AQUÍ EL ID REAL DEL PRODUCTO
    $sala_url = site_url('/sala/'); // <-- cambia si tu slug es distinto

    if ( $product_id <= 0 ) return;

    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    $has_product = false;
    foreach ( $order->get_items() as $item ) {
        if ( intval($item->get_product_id()) === intval($product_id) ) {
            $has_product = true;
            break;
        }
    }

    if ( $has_product ) {
        echo '<div style="margin-top:16px;padding:16px;border:1px solid #ddd;border-radius:10px;">
            <p><strong>Tu sala ya está lista.</strong> Entra para comenzar tu consulta.</p>
            <p><a href="'.esc_url($sala_url).'" style="display:inline-block;padding:12px 18px;border-radius:10px;background:#111;color:#fff;text-decoration:none;">Acceder a la sala</a></p>
        </div>';
    }
}
add_action( 'woocommerce_thankyou', 'gabytarot_add_sala_button_on_thankyou', 20 );
// ===============================
// GABYTAROT - Sesiones 12/20/30 por pedido + sala privada + timer iniciado por admin
// ===============================

// 1) CONFIGURACIÓN
function gabytarot_session_config() {
    return [
        'sala_slug' => '/sala/',

        // ProductoID => minutos
        'products_minutes' => [
            310 => 12,
            300 => 20,
            311 => 30,
        ],
    ];
}

// 2) Obtener minutos desde un pedido
function gabytarot_get_minutes_from_order( $order ) {
    $cfg = gabytarot_session_config();
    $map = $cfg['products_minutes'];

    foreach ( $order->get_items() as $item ) {
        $pid = (int) $item->get_product_id();
        if ( isset($map[$pid]) && (int)$map[$pid] > 0 ) {
            return (int)$map[$pid];
        }
    }
    return 0;
}

// 3) Botón "Entrar a la sala" en la página de pedido recibido con order+key
function gabytarot_thankyou_sala_button( $order_id ) {
    if ( ! $order_id ) return;

    $order = wc_get_order($order_id);
    if ( ! $order ) return;

    $minutes = gabytarot_get_minutes_from_order($order);
    if ( $minutes <= 0 ) return;

    $cfg = gabytarot_session_config();
    $sala_url = site_url( $cfg['sala_slug'] );
    $order_key = $order->get_order_key();

    $link = add_query_arg([
        'order' => $order_id,
        'key'   => $order_key
    ], $sala_url);

    echo '<div style="margin-top:16px;padding:16px;border:1px solid #ddd;border-radius:12px;">
        <p><strong>Tu sesión de '.$minutes.' minutos está confirmada.</strong> El tiempo comenzará cuando el profesional inicie la consulta.</p>
        <p><a href="'.esc_url($link).'" style="display:inline-block;padding:12px 18px;border-radius:12px;background:#111;color:#fff;text-decoration:none;">Entrar a la sala</a></p>
    </div>';
}
add_action('woocommerce_thankyou', 'gabytarot_thankyou_sala_button', 30);

// 4) Marcar sesión pendiente cuando el pedido se paga
function gabytarot_mark_session_pending_on_paid( $order_id ) {
    $order = wc_get_order($order_id);
    if ( ! $order ) return;

    $minutes = gabytarot_get_minutes_from_order($order);
    if ( $minutes <= 0 ) return;

    if ( ! $order->get_meta('_gabytarot_session_status', true) ) {
        $order->update_meta_data('_gabytarot_session_status', 'pending'); // pending | running | finished
        $order->update_meta_data('_gabytarot_session_minutes', $minutes);
        $order->save();
    }

    // Bloqueo global: ocupas la plataforma (los 3 productos se agotan)
    gabytarot_set_products_stock_global(false);
}
// add_action('woocommerce_payment_complete', 'gabytarot_mark_session_pending_on_paid', 20);
// add_action('woocommerce_order_status_completed', 'gabytarot_mark_session_pending_on_paid', 20);
add_action('woocommerce_order_status_processing', 'gabytarot_mark_session_pending_on_paid', 20);

// 5) Stock global: si hay sesión pendiente/en curso, ninguno se compra
function gabytarot_set_products_stock_global( $available ) {
    $cfg = gabytarot_session_config();
    $map = $cfg['products_minutes'];

    foreach ( $map as $product_id => $mins ) {
        $product_id = (int)$product_id;
        if ( $product_id <= 0 ) continue;

        $product = wc_get_product($product_id);
        if ( ! $product ) continue;

        $product->set_manage_stock(true);
        $product->set_stock_quantity( $available ? 1 : 0 );
        $product->set_stock_status( $available ? 'instock' : 'outofstock' );
        $product->save();
    }
}

// 6) Shortcode de sala por pedido (valida order + key) + botones admin iniciar/finalizar + timer
function gabytarot_sala_by_order_shortcode() {

    if ( empty($_GET['order']) || empty($_GET['key']) ) {
        return '<p>Acceso no válido. Entra desde el enlace de tu pedido.</p>';
    }


    $order_id = (int) $_GET['order'];
    $key = sanitize_text_field($_GET['key']);

    $order = wc_get_order($order_id);
    if ( ! $order ) return '<p>Pedido no encontrado.</p>';

    if ( $order->get_order_key() !== $key ) {
        return '<p>Acceso no válido (clave incorrecta).</p>';
    }


// === INICIO AUTOMÁTICO AL ENTRAR EN LA SALA ===
$session_status = $order->get_meta('_gabytarot_session_status', true);
$started_at     = (int) $order->get_meta('_gabytarot_session_started_at', true);





    // Solo pedidos pagados
    $status = $order->get_status();
    if ( ! in_array($status, ['processing','completed'], true) ) {
        return '<p>Este pedido aún no está confirmado.</p>';
    }
// === INICIO AUTOMÁTICO AL ENTRAR EN LA SALA ===
$session_status = $order->get_meta('_gabytarot_session_status', true);
$started_at     = (int) $order->get_meta('_gabytarot_session_started_at', true);

if ( $session_status === 'pending' && $started_at <= 0 ) {
    $order->update_meta_data('_gabytarot_session_status', 'running');
    $order->update_meta_data('_gabytarot_session_started_at', time());
    $order->save();

    $session_status = 'running';
    $started_at = time();
}

    $minutes = (int) $order->get_meta('_gabytarot_session_minutes', true);
    if ( $minutes <= 0 ) $minutes = gabytarot_get_minutes_from_order($order);
    if ( $minutes <= 0 ) return '<p>Este pedido no corresponde a una sesión.</p>';

    $session_status = $order->get_meta('_gabytarot_session_status', true);
    if ( ! $session_status ) $session_status = 'pending';

    $start_ts = (int) $order->get_meta('_gabytarot_session_start_ts', true);
    $duration_sec = $minutes * 60;

    $is_admin = current_user_can('manage_woocommerce');

    // Acciones admin iniciar/finalizar
    if ( $is_admin && ! empty($_POST['gabytarot_action']) && check_admin_referer('gabytarot_sala_'.$order_id) ) {

        if ( $_POST['gabytarot_action'] === 'start' ) {
            $order->update_meta_data('_gabytarot_session_status', 'running');
            $order->update_meta_data('_gabytarot_session_start_ts', time());
            $order->save();
            $session_status = 'running';
            $start_ts = (int)$order->get_meta('_gabytarot_session_start_ts', true);
        }

        if ( $_POST['gabytarot_action'] === 'finish' ) {
            $order->update_meta_data('_gabytarot_session_status', 'finished');
            $order->save();
            $session_status = 'finished';

            // Liberar disponibilidad global
            gabytarot_set_products_stock_global(true);
        }
    }

    // Tiempo restante
    $remaining = $duration_sec;
    if ( $session_status === 'running' && $start_ts > 0 ) {
        $elapsed = max(0, time() - $start_ts);
        $remaining = max(0, $duration_sec - $elapsed);
    }

    ob_start();

    echo '<div style="padding:16px;border:1px solid #ddd;border-radius:12px;">';
    echo '<h2 style="margin-top:0;">Sala privada</h2>';

    if ( $session_status === 'pending' ) {
        echo '<p><strong>Sesión pendiente.</strong> El tiempo comenzará cuando el profesional inicie la consulta.</p>';
    } elseif ( $session_status === 'running' ) {
        echo '<p><strong>Sesión en curso.</strong> Duración: '.$minutes.' minutos.</p>';
    } else {
        echo '<p><strong>Sesión finalizada.</strong> Gracias por tu confianza.</p>';
    }

    echo '<div id="gabytarot-timer" data-status="'.esc_attr($session_status).'" data-remaining="'.esc_attr($remaining).'"></div>';

    if ( $session_status !== 'finished' ) {
        echo '<hr style="margin:16px 0;">';
        echo '<p><strong>Zona de consulta:</strong> aquí insertaremos el chat y el acceso a la llamada.</p>';
    }

    if ( $is_admin ) {
        echo '<hr style="margin:16px 0;">';
        echo '<form method="post">';
        wp_nonce_field('gabytarot_sala_'.$order_id);

        if ( $session_status === 'pending' ) {
            echo '<button name="gabytarot_action" value="start" style="padding:10px 14px;border-radius:10px;">Iniciar sesión ('.$minutes.' min)</button>';
        }
        if ( $session_status === 'running' ) {
            echo '<button name="gabytarot_action" value="finish" style="padding:10px 14px;border-radius:10px;">Finalizar sesión</button>';
        }

        echo '</form>';
    }

    echo '</div>';
    ?>
    <script>
    (function(){
      var el = document.getElementById('gabytarot-timer');
      if(!el) return;

      var status = el.getAttribute('data-status');
      var remaining = parseInt(el.getAttribute('data-remaining') || '0', 10);

      function fmt(s){
        var m = Math.floor(s/60), r = s%60;
        return String(m).padStart(2,'0') + ':' + String(r).padStart(2,'0');
      }

      function render(){
        if(status === 'pending'){
          el.innerHTML = '<div style="padding:12px;border-radius:12px;background:#fafafa;border:1px solid #eee;"><strong>Esperando inicio…</strong></div>';
          return;
        }
        if(status === 'finished'){
          el.innerHTML = '<div style="padding:12px;border-radius:12px;background:#fafafa;border:1px solid #eee;"><strong>Sesión finalizada.</strong></div>';
          return;
        }
        el.innerHTML = '<div style="padding:12px;border-radius:12px;background:#fafafa;border:1px solid #eee;"><strong>Tiempo restante:</strong> ' + fmt(remaining) + '</div>';
      }

      render();

      if(status === 'running'){
        var t = setInterval(function(){
          remaining = Math.max(0, remaining - 1);
          render();
          if(remaining <= 0){
            clearInterval(t);
          }
        }, 1000);
      }
    })();
    </script>
    <?php

    return ob_get_clean();
}
add_shortcode('gabytarot_sala_order', 'gabytarot_sala_by_order_shortcode');

