/*
 * SrdevYTPlayer v2.8 — Pause no longer restores thumbnail
 * Author: srdev (patched)
 * Change: do NOT remove player on PAUSE. Players are only removed on END or when another
 *         player is injected (prevents multiple simultaneous players). Other features unchanged.
 */

(function (window, document) {
  'use strict';

  const SELECTOR = '[data-srdev-yt-player-wrapper]';
  const URL_ATTR = 'data-srdev-yt-player-url';
  const THUMB_ATTR = 'data-srdev-yt-player-thumbnail';
  const PLAYER_CLASS = 'srdev-yt-player';
  const LOADER_CLASS = 'srdev-yt-player-loader';
  const HIDDEN_THUMB = 'srdev-yt-hidden-thumb';
  const FADEABLE_THUMB = 'srdev-yt-thumb-fadeable';
  const FADE_MS = 260;
  const SEEK_THRESHOLD = 1.4;
  const PLAY_POLL = 250;

  let activeWrapper = null;
  const ytPlayers = new WeakMap();
  const ytLastTime = new WeakMap();
  const ytTimes = new WeakMap();
  const ytPollers = new WeakMap();

  /* ----------------- Utils ----------------- */
  const readUrl = el => el?.getAttribute(URL_ATTR) || '';
  const findThumb = el => el?.querySelector(`[${THUMB_ATTR}]`) || el?.firstElementChild || null;

  function injectLoader(wrapper) {
    if (wrapper.querySelector(`.${LOADER_CLASS}`)) return;
    const l = document.createElement('div');
    l.className = LOADER_CLASS;
    wrapper.appendChild(l);
  }
  function removeLoader(wrapper) {
    const l = wrapper.querySelector(`.${LOADER_CLASS}`);
    if (l) l.remove();
  }

  function showThumb(wrapper) {
    const t = findThumb(wrapper);
    if (!t) return;
    t.classList.add(FADEABLE_THUMB);
    t.classList.remove(HIDDEN_THUMB);
    t.style.visibility = 'visible';
    t.style.opacity = '1';
  }
  function hideThumb(wrapper) {
    const t = findThumb(wrapper);
    if (!t) return;
    t.classList.add(HIDDEN_THUMB, FADEABLE_THUMB);
  }

  function removePlayer(wrapper, player) {
    if (!player) return;
    showThumb(wrapper);
    player.style.transition = `opacity ${FADE_MS}ms ease, transform ${FADE_MS}ms ease`;
    player.style.opacity = '0';
    player.style.transform = 'scale(1.01)';
    setTimeout(() => {
      try { player.remove(); } catch {}
      wrapper.classList.remove('srdev-yt-playing', 'srdev-yt-loading');
      wrapper.classList.add('srdev-yt-paused');
      removeLoader(wrapper);
    }, FADE_MS + 15);
  }

  function pauseAllExcept(wrapper) {
    document.querySelectorAll(SELECTOR).forEach(w => {
      if (w === wrapper) return;
      const p = w.querySelector(`.${PLAYER_CLASS}`);
      if (p) removePlayer(w, p);
    });
  }

  /* ----------------- YouTube API ----------------- */
  let ytApiReady = false, ytQueue = [];
  function ensureYTAPI(cb) {
    if (ytApiReady && window.YT?.Player) return cb();
    ytQueue.push(cb);
    if (!document.getElementById('srdev-yt-api')) {
      const s = document.createElement('script');
      s.id = 'srdev-yt-api';
      s.src = 'https://www.youtube.com/iframe_api';
      document.head.appendChild(s);
    }
    window.onYouTubeIframeAPIReady = () => {
      ytApiReady = true;
      ytQueue.splice(0).forEach(fn => fn());
    };
  }

  function startYTPoll(iframe, player) {
    stopYTPoll(iframe);
    const id = setInterval(() => {
      try {
        const t = player.getCurrentTime();
        // only store valid numeric times
        if (typeof t === 'number' && !Number.isNaN(t)) {
          ytLastTime.set(iframe, t);
          const wrap = iframe.closest(SELECTOR);
          if (wrap) ytTimes.set(wrap, t);
        }
      } catch {}
    }, PLAY_POLL);
    ytPollers.set(iframe, id);
  }
  function stopYTPoll(iframe) {
    const id = ytPollers.get(iframe);
    if (id) clearInterval(id);
    ytPollers.delete(iframe);
  }

  function attachYTPlayer(iframe, wrapper) {
    ensureYTAPI(() => {
      if (ytPlayers.has(iframe)) return;
      const player = new YT.Player(iframe, {
        events: {
          onReady: () => {
            // store player instance
            ytPlayers.set(iframe, player);
            // defensively seed last time from player if possible
            try {
              const t = player.getCurrentTime();
              if (typeof t === 'number' && !Number.isNaN(t)) ytLastTime.set(iframe, t);
            } catch {}
          },
          onStateChange: e => {
            const s = e.data;
            if (s === YT.PlayerState.PLAYING) {
              try {
                const cur = player.getCurrentTime();
                if (typeof cur === 'number' && !Number.isNaN(cur)) ytLastTime.set(iframe, cur);
              } catch {}
              startYTPoll(iframe, player);
            } else if (s === YT.PlayerState.PAUSED) {
              // **CHANGE**: do not remove player on PAUSED. Just stop poll and update stored time.
              stopYTPoll(iframe);
              try {
                const cur = player.getCurrentTime();
                if (typeof cur === 'number' && !Number.isNaN(cur)) {
                  ytTimes.set(wrapper, cur);
                  ytLastTime.set(iframe, cur);
                }
              } catch {}
            } else if (s === YT.PlayerState.ENDED) {
              stopYTPoll(iframe);
              requestAnimationFrame(() => removePlayer(wrapper, iframe));
            }
          }
        }
      });

      // NOTE: removed the "safePause" blur handler to avoid accidental instant-removal on blur.
    });
  }

  /* ----------------- Inject Player ----------------- */
  function injectPlayer(wrapper, url) {
    if (!wrapper || !url) return;
    pauseAllExcept(wrapper);

    if (wrapper.classList.contains('srdev-yt-playing')) {
      const p = wrapper.querySelector(`.${PLAYER_CLASS}`);
      if (p) removePlayer(wrapper, p);
      return;
    }

    wrapper.classList.add('srdev-yt-loading');
    injectLoader(wrapper);

    const origin = encodeURIComponent(location.origin);
    const mkYT = (id, start = 0) =>
      `https://www.youtube.com/embed/${id}?autoplay=1&start=${Math.floor(start)}&enablejsapi=1&rel=0&playsinline=1&origin=${origin}`;

    let node, type = '';
    if (url.includes('youtube.com/watch?v=') || url.includes('youtu.be/')) {
      const id = url.includes('v=') ? url.split('v=')[1].split('&')[0] : url.split('youtu.be/')[1].split('?')[0];
      const resume = ytTimes.get(wrapper) || 0;
      node = document.createElement('iframe');
      node.src = mkYT(id, resume);
      type = 'youtube';
    } else if (url.includes('vimeo.com/')) {
      const id = url.split('vimeo.com/')[1].split('?')[0];
      node = document.createElement('iframe');
      node.src = `https://player.vimeo.com/video/${id}?autoplay=1&api=1`;
      type = 'vimeo';
    } else if (url.endsWith('.mp4') || url.includes('.mp4')) {
      node = document.createElement('video');
      node.src = url;
      node.autoplay = true;
      node.controls = true;
      node.playsInline = true;
      type = 'html5';
    }

    node.className = PLAYER_CLASS;
    node.dataset.player = type;
    node.allow = 'autoplay; fullscreen; picture-in-picture';
    node.style.cssText = `
      position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
      opacity:0;transform:scale(1.01);
      transition:opacity ${FADE_MS}ms ease, transform ${FADE_MS}ms ease;
      z-index:9999;border:0;
    `;
    wrapper.appendChild(node);

    const onReady = () => {
      hideThumb(wrapper);
      requestAnimationFrame(() => {
        node.style.opacity = '1';
        node.style.transform = 'scale(1)';
      });

      wrapper.classList.remove('srdev-yt-loading');
      wrapper.classList.add('srdev-yt-playing');
      removeLoader(wrapper);
      activeWrapper = wrapper;

      if (type === 'youtube') attachYTPlayer(node, wrapper);
      else if (type === 'vimeo') {
        // keep existing behaviour: vimeo events added by postMessage; don't auto-remove on pause
        node.contentWindow.postMessage({ method: 'addEventListener', value: 'pause' }, '*');
        node.contentWindow.postMessage({ method: 'addEventListener', value: 'ended' }, '*');
      } else if (type === 'html5') {
        let lastSeek = 0;
        node.addEventListener('seeking', () => { lastSeek = Date.now(); });
        node.addEventListener('pause', () => {
          if (Date.now() - lastSeek < 400) return;
          // **CHANGE**: do not remove player on pause. Save current time for resume.
          try { ytTimes.set(wrapper, node.currentTime || 0); } catch {}
        });
        node.addEventListener('ended', () => removePlayer(wrapper, node));
      }
    };

    if (node.tagName === 'IFRAME') node.addEventListener('load', onReady, { once: true });
    else node.addEventListener('loadeddata', onReady, { once: true });
  }

  /* ----------------- Bind / Init ----------------- */
  function bindAll() {
    document.querySelectorAll(SELECTOR).forEach(w => {
      if (w._srbound) return;
      w._srbound = true;
      if (getComputedStyle(w).position === 'static') w.style.position = 'relative';
      w.addEventListener('click', e => {
        e.preventDefault();
        injectPlayer(w, readUrl(w));
      });
    });
  }

  function destroyAll() {
    document.querySelectorAll(SELECTOR).forEach(w => {
      if (w._srbound) w._srbound = false;
      const p = w.querySelector(`.${PLAYER_CLASS}`);
      if (p) p.remove();
      showThumb(w);
      removeLoader(w);
      w.classList.remove('srdev-yt-playing', 'srdev-yt-paused', 'srdev-yt-loading');
    });
  }

  window.SrdevYTPlayer = { int: bindAll, destroy: destroyAll };

  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bindAll);
  else bindAll();

})(window, document);




