<?php
/*
 * Template name: Studies
 *
 * @package far_loop
 */

get_header();

$fields = array_fill_keys( array(
  'featured_image',
  'description',
), null );

foreach ( $fields as $field => $value ) {
  $fields[$field] = get_field( $field );
}

// Helpers
function far_loop_img_url_or_placeholder( $pid ) {
  $ph = get_template_directory_uri() . '/img/horizontal-placeholder.svg';

  // 1) Featured image
  $thumb = get_the_post_thumbnail_url( $pid, 'large' );
  if ( $thumb ) return $thumb;

  // 2) ACF featured_image (por si lo usas en activity)
  $acf_img = get_field( 'featured_image', $pid );
  if ( is_array($acf_img) ) {
    if ( !empty($acf_img['sizes']['large']) ) return $acf_img['sizes']['large'];
    if ( !empty($acf_img['url']) ) return $acf_img['url'];
  } elseif ( is_numeric($acf_img) ) {
    $src = wp_get_attachment_image_src( (int)$acf_img, 'large' );
    if (!empty($src[0])) return $src[0];
  } elseif ( is_string($acf_img) && filter_var($acf_img, FILTER_VALIDATE_URL) ) {
    return $acf_img;
  }

  return $ph;
}

// === 1) Obtenemos términos de 'edition', evitando duplicados WPML por base del slug ===
$edition_terms = get_terms( array(
  'taxonomy'   => 'edition',
  'hide_empty' => false,       // luego filtramos nosotros por contenido real
) );

$editions = array(); // array de entradas únicas por edición
if ( ! is_wp_error($edition_terms) && ! empty($edition_terms) ) {
  $seen = array(); // base_slug => bool
  foreach ( $edition_terms as $term ) {
    $base_slug = preg_replace('/-(es|en|ca|fr|de|it|pt|nl|eu|gl)$/i', '', sanitize_title($term->slug));
    if ( isset($seen[$base_slug]) ) continue;

    // extrae año si existe
    $yr = null;
    if ( preg_match('/\b(20\d{2}|19\d{2})\b/', $term->name, $m) ) {
      $yr = (int) $m[1];
    }

    $editions[] = array(
      'term'      => $term,
      'base_slug' => $base_slug,
      'year'      => $yr,
      'label'     => $yr ? ('Edition ' . $yr) : $term->name,
    );
    $seen[$base_slug] = true;
  }

  // Ordena por año desc; los sin año al final por nombre desc
  usort($editions, function($a,$b){
    if ($a['year'] && $b['year']) return $b['year'] <=> $a['year'];
    if ($a['year'] && ! $b['year']) return -1;
    if (! $a['year'] && $b['year']) return 1;
    return strcasecmp($b['term']->name, $a['term']->name);
  });
}
?>

<div class="u_pt-3 u_pt-md-6">
  <div id="mainContainer" class="l_container">

    <?php if ( ! empty($fields['featured_image']['url']) ) : ?>
      <figure class="cover-image activity-single-image">
        <img src="<?php echo esc_url($fields['featured_image']['url']); ?>" alt="<?php echo esc_attr($fields['featured_image']['caption'] ?? get_the_title());?>">
        <?php if ( ! empty($fields['featured_image']['caption']) ) : ?>
          <figcaption class="cover-image__caption"><?php echo wp_kses_post($fields['featured_image']['caption']); ?></figcaption>
        <?php endif; ?>
      </figure>
    <?php endif; ?>

    <div class="grid u_mh-min1p5">
      <div data-sticky-sidebar class="col--sm--three--seventh col--md--two--fifth u_ph-1p5">
        <div class="page-title u_mb-3 u_mb-md-4">
          <h1 class="page-title__apex-title u_mb-0p5"><?php the_title(); ?></h1>
        </div>
      </div>
      <div class="col--sm--four--seventh col--md--three--fifth u_ph-1p5">
        <div class="wysiwyg">
          <?php echo wp_kses_post($fields['description']); ?>
        </div>
      </div>
    </div>

    <?php
    // === 2) Por cada edición, hacemos una query de 'activity' con taxonomy activity-type=professional-meeting ===
    // Solo mostramos secciones con contenido.

    if ( ! empty($editions) ) :
      $slider_index = 0;

      foreach ( $editions as $ed ) :
        $term = $ed['term'];
        $year = $ed['year'];
        $label = $ed['label'];

        // Comprobar contenido real
        $q = new WP_Query( array(
          'post_type'           => 'activity',
          'post_status'         => 'publish',
          'posts_per_page'      => -1,
          'ignore_sticky_posts' => true,
          'no_found_rows'       => true,
          'suppress_filters'    => false, // WPML: respeta idioma actual
          'tax_query'           => array(
            'relation' => 'AND',
            array(
              'taxonomy' => 'activity-type',
              'field'    => 'slug',
              'terms'    => array('professional-meeting'),
            ),
            array(
              'taxonomy' => 'edition',
              'field'    => 'term_id',
              'terms'    => (int) $term->term_id,
            ),
          ),
          'orderby' => 'title',
          'order'   => 'ASC',
        ) );

        if ( ! $q->have_posts() ) {
          wp_reset_postdata();
          continue; // no mostramos sección si no hay contenido
        }

        // IDs únicos para este slider
        $slider_index++;
        $root_id   = 'studiesSwiper-' . sanitize_html_class($term->slug) . '-' . $slider_index;
        $swiper_id = $root_id . '-swiper';

        // Controles (por accesibilidad los dejamos fuera del wrapper Swiper)
        ?>
        <section class="u_mv-2 studies-edition-section" id="<?php echo esc_attr('edition-'.$term->slug); ?>">
          <div class="grid u_mh-min1p5">
            <div data-sticky-sidebar class="col--sm--one--half u_ph-1p5">
              <h3 class="section-heading delta">
                <span class="u_text-underline"><?php echo esc_html( $label ); ?></span>
              </h3>
            </div>
          </div>

          <div class="studies-swiper-outer" data-studies-swiper-root="<?php echo esc_attr($root_id); ?>">
            <div class="swiper studies-swiper" id="<?php echo esc_attr($swiper_id); ?>" style="opacity:0; transition:opacity .2s;">
              <!-- Controles -->
              <div class="swiper-nav">
                <button class="swiper-btn prev" id="<?php echo esc_attr($root_id . '-prev'); ?>" aria-label="<?php esc_attr_e('Previous','far_loop'); ?>">&larr;</button>
                <button class="swiper-btn next" id="<?php echo esc_attr($root_id . '-next'); ?>" aria-label="<?php esc_attr_e('Next','far_loop'); ?>">&rarr;</button>
              </div>

              <div class="swiper-wrapper">
                <?php
                while ( $q->have_posts() ) : $q->the_post();
                  $pid   = get_the_ID();
                  $title = get_the_title();
                  $url   = get_permalink();
                  $img   = far_loop_img_url_or_placeholder( $pid );

                  // Subtítulo opcional: venue, fechas, etc; ajusta a tus ACF si quieres
                  $subtitle = '';
                  $venue = get_field('venue', $pid);
                  if ( is_object($venue) ) $subtitle = $venue->post_title;

                  ?>
                  <div class="swiper-slide">
                    <div class="archive-item">
                      <a href="<?php echo esc_url($url); ?>" class="archive-new-thumb">
                        <div class="archive-thumb__image-container activity">
                          <img src="<?php echo esc_url($img); ?>" alt="<?php echo esc_attr($title); ?>">
                        </div>
                        <div class="archive-thumb__text">
                          <?php if ( $subtitle ) : ?>
                            <div class="archive-thumb__label"><?php echo esc_html( $subtitle ); ?></div>
                          <?php endif; ?>
                          <h3 class="archive-thumb__title"><?php echo esc_html( $title ); ?></h3>
                        </div>
                      </a>
                    </div>
                  </div>
                <?php endwhile; wp_reset_postdata(); ?>
              </div>
            </div>
          </div>
        </section>
      <?php endforeach; ?>
    <?php endif; ?>

  </div>
</div>

<?php /* ===== Swiper loader + init SOLO para estos sliders ===== */ ?>
<script>
(function(){
  // Cargador único (reutiliza si ya está en la página)
  window.__ensureSwiper = window.__ensureSwiper || (function(){
    var p;
    return function ensureSwiper(){
      if (window.Swiper) return Promise.resolve();
      if (p) return p;
      p = new Promise(function(resolve){
        if (!document.getElementById('swiper-css-cdn')) {
          var link = document.createElement('link');
          link.id = 'swiper-css-cdn';
          link.rel = 'stylesheet';
          link.href = 'https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.css';
          document.head.appendChild(link);
        }
        if (!document.getElementById('swiper-js-cdn')) {
          var script = document.createElement('script');
          script.id = 'swiper-js-cdn';
          script.src = 'https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.js';
          script.defer = true;
          script.onload = function(){ resolve(); };
          document.head.appendChild(script);
        } else {
          var i = setInterval(function(){
            if (window.Swiper) { clearInterval(i); resolve(); }
          }, 30);
        }
      });
      return p;
    };
  })();

  function safeToggleNav(sw, need) {
    if (!sw) return;
    var nxt = sw.navigation && sw.navigation.nextEl instanceof HTMLElement ? sw.navigation.nextEl : null;
    var prv = sw.navigation && sw.navigation.prevEl instanceof HTMLElement ? sw.navigation.prevEl : null;
    if (nxt) nxt.style.display = need ? '' : 'none';
    if (prv) prv.style.display = need ? '' : 'none';
  }

  function initStudiesSwipers(){
    document.querySelectorAll('[data-studies-swiper-root]').forEach(function(root){
      var rootId = root.getAttribute('data-studies-swiper-root');
      if (!rootId) return;

      var el = document.getElementById(rootId + '-swiper');
      if (!el || el.__inited) return;
      el.__inited = true;

      var nextEl = document.getElementById(rootId + '-next');
      var prevEl = document.getElementById(rootId + '-prev');

      // PV dinámico según nº de slides
      var totalSlides = el.querySelectorAll('.swiper-slide').length || 0;
      var pvDesktop, pv1024;
      if (totalSlides <= 3) {
        pvDesktop = 3;   pv1024 = 3;
      } else if (totalSlides === 4) {
        pvDesktop = 4;   pv1024 = 3.2;
      } else {
        pvDesktop = 4.2; pv1024 = 3.2;
      }

      var sw = new Swiper(el, {
        slidesPerView: 1.2,
        spaceBetween: 15,
        watchSlidesProgress: true,
        observer: true,
        observeParents: true,
        preloadImages: false,
        lazy: { loadOnTransitionStart: true },
        navigation: (nextEl && prevEl) ? { nextEl: nextEl, prevEl: prevEl } : undefined,
        breakpoints: {
          640:  { slidesPerView: 1.2, spaceBetween: 15 },
          768:  { slidesPerView: 2.2, spaceBetween: 15 },
          1024: { slidesPerView: pv1024, spaceBetween: 32 },
          1366: { slidesPerView: pvDesktop, spaceBetween: 32 }
        },
        on: {
          init: function(){
            el.style.opacity = '1';
            var pv = this.params.slidesPerView || pvDesktop;
            var need = totalSlides > pv;
            safeToggleNav(this, need);
          },
          resize: function(){
            var pv = this.params.slidesPerView || pvDesktop;
            var need = this.slides.length > pv;
            safeToggleNav(this, need);
          }
        }
      });

      var refresh = function(){
        if (!sw) return;
        sw.update(); sw.updateSlides(); sw.updateSize();
        var pv = sw.params.slidesPerView || pvDesktop;
        safeToggleNav(sw, sw.slides.length > pv);
      };

      // Refrescos robustos
      var imgs = el.querySelectorAll('img');
      imgs.forEach(function(img){
        if (img.complete) refresh();
        img.addEventListener('load',  refresh, { once:true });
        img.addEventListener('error', refresh, { once:true });
      });
      if (document.fonts && document.fonts.ready) document.fonts.ready.then(refresh);
      window.addEventListener('load', refresh);
      setTimeout(refresh, 400);
      setTimeout(refresh, 1200);
    });
  }

  function boot(){ window.__ensureSwiper().then(initStudiesSwipers); }
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', boot);
  } else {
    boot();
  }
  window.addEventListener('farloop:refresh-swipers', boot);
})();
</script>

<?php get_footer();