import './_commonjsHelpers-0c4b6f40.js';
import './core.get-iterator-method-86d4db69.js';
import './_library-528f1934.js';
import './_iter-detect-130ee549.js';
import './_object-pie-33c40e79.js';
import { _ as _extends } from './extends-a4230287.js';
import './web.dom.iterable-f8f967cd.js';
import React, { useState, useEffect } from 'react';
import { l as lib_3, a as lib_2 } from './index-1819118a.js';
import PropTypes from 'prop-types';
import './isSymbol-1981418f.js';
import { d as debounce_1 } from './debounce-9207d8ee.js';
import './toNumber-2f7a84cd.js';
import { _ as _slicedToArray } from './slicedToArray-67a08c9c.js';
import './main-43ca42fe.js';
import './stringify-70b72959.js';
import './asyncToGenerator-7bf8bc4d.js';
import Segment from './Segment.js';
import './Beam.js';

var initialLoadIsDone = false;
var initialLoadInProgress = false;

function runOnce(fn) {
  var called = false;
  return function () {
    if (called) {
      return;
    }
    called = true;
    fn.apply(this, arguments);
  };
}

var getSignalsAndRefreshAds = function getSignalsAndRefreshAds(slotId) {
  lib_3.getGoogletag().then(function (googletag) {
    googletag.cmd.push(function () {
      if (!initialLoadIsDone && !initialLoadInProgress && googletag.pubads().getSlots().length > 0) {
        // trigger ads refresh within googletag
        var refreshAds = function refreshAds() {
          googletag.cmd.push(function () {
            googletag.pubads().refresh();
            initialLoadIsDone = true;
          });
        };
        // wrap to make sure it's called once


        initialLoadInProgress = true;var refreshAdsOnce = runOnce(refreshAds);
        // trigger signals request and refresh ads when it's ready
        window.PQ.cmd.push(function () {
          PQ.loadSignals(['ids', 'bsc', 'vlp'], refreshAdsOnce);
        });
        // just in case something go wrong ads will be refreshed anyway after specified timeout
        var timeout = 1000;
        setTimeout(refreshAdsOnce, timeout);
      }
      if (initialLoadIsDone) {
        googletag.cmd.push(function () {
          var slots = googletag.pubads().getSlots();
          // find new slot within googletag
          var newSlot = slots.find(function (slot) {
            return slot.getSlotElementId() === slotId;
          });
          // refresh single slot which was added
          function refreshAd() {
            googletag.cmd.push(function () {
              googletag.pubads().refresh([newSlot]);
            });
          }
          var refreshAdOnce = runOnce(refreshAd);
          // get VLP signal value only for the added slot; IDS and BSC signals are global for the whole page so no need to refetch
          window.PQ.cmd.push(function () {
            PQ.loadSignalsForSlots([newSlot], refreshAdOnce);
          });
          var timeout = 1000;
          setTimeout(refreshAdOnce, timeout);
        });
      }
    });
  });
};

var DFPAdSlot = function DFPAdSlot(_ref) {
  var adUnit = _ref.adUnit,
      sizeMapping = _ref.sizeMapping,
      className = _ref.className,
      slotId = _ref.slotId,
      sizes = _ref.sizes,
      _ref$targeting = _ref.targeting,
      targeting = _ref$targeting === undefined ? {} : _ref$targeting,
      _ref$refreshFlag = _ref.refreshFlag,
      refreshFlag = _ref$refreshFlag === undefined ? true : _ref$refreshFlag,
      checkIsAdFound = _ref.checkIsAdFound,
      _ref$setStickyAd = _ref.setStickyAd,
      setStickyAd = _ref$setStickyAd === undefined ? function () {} : _ref$setStickyAd;

  var _useState = useState(false),
      _useState2 = _slicedToArray(_useState, 2),
      adRendered = _useState2[0],
      setAdRendered = _useState2[1];

  var _useState3 = useState(false),
      _useState4 = _slicedToArray(_useState3, 2),
      adRefreshable = _useState4[0],
      setAdRefreshable = _useState4[1];

  var _useState5 = useState(false),
      _useState6 = _slicedToArray(_useState5, 2),
      adHasFocus = _useState6[0],
      setAdHasFocus = _useState6[1];

  targeting.ksg = typeof window !== 'undefined' && window.Krux ? window.Krux.segments : null;
  targeting.kuid = typeof window !== 'undefined' && window.Krux ? window.Krux.user : null;

  var adTargeting = _extends({}, targeting, { hostname: typeof window !== 'undefined' ? window.location.hostname : null });

  var handleVisibilityChange = debounce_1(function (_ref2) {
    var event = _ref2.event;

    if (event.inViewPercentage <= 0) {
      setAdRefreshable(false);
    } else {
      setAdRefreshable(true);
    }
  }, 500);

  useEffect(function () {
    // Setting hostname into AD targetting
    if (window && window.location && window.location.hostname) {
      adTargeting.hostname = window.location.hostname;
    }
  }, [adTargeting]);

  var _useState7 = useState(null),
      _useState8 = _slicedToArray(_useState7, 2),
      eventData = _useState8[0],
      setEventData = _useState8[1];

  return React.createElement(
    'div',
    { className: className, style: { textAlign: 'center' } },
    React.createElement(lib_2, {
      style: { marginBottom: '1rem' },
      slotId: slotId,
      sizes: sizes,
      adUnit: adUnit,
      sizeMapping: sizeMapping,
      targetingArguments: adTargeting,
      onSlotIsViewable: function onSlotIsViewable(e) {
        setStickyAd(true);
        //Beam.report_beam_ad('Impression', deviceType, eventData.cID, eventData.lID, eventData.campID, eventData.adSize, eventData.slot_id)
        Segment.adViewed(eventData.domain, eventData.advertiserId, eventData.campID, eventData.cID, eventData.lID, eventData.adSize, eventData.isEmpty, eventData.sourceAgnosticCreativeId, eventData.sourceAgnosticLineItemId);
      },
      onSlotRender: function onSlotRender(eventData) {
        // Updating the condition to remove the dependency on static slotId.
        if (eventData && eventData.event && checkIsAdFound && checkIsAdFound !== null) {
          if (eventData.event.size !== null && eventData.event.size.length) {
            checkIsAdFound(true, eventData);
          } else {
            checkIsAdFound(false, eventData);
          }
        } else if (checkIsAdFound && checkIsAdFound !== null) {
          checkIsAdFound(false, eventData);
        }

        setAdRendered(true);
        if (eventData && eventData.event) {
          var cID = eventData.event.creativeId;
          var lID = eventData.event.lineItemId;
          var campID = eventData.event.campaignId;
          var adSize = eventData.event.size && eventData.event.size.length > 1 ? eventData.event.size[0] + 'x' + eventData.event.size[1] : '';
          var slot_id = eventData.slotId ? eventData.slotId : '';
          var isEmpty = eventData.event.isEmpty;
          var sourceAgnosticCreativeId = eventData.event.sourceAgnosticCreativeId;
          var sourceAgnosticLineItemId = eventData.event.sourceAgnosticLineItemId;
          var advertiserId = eventData.event.advertiserId;
          var domain = typeof window !== 'undefined' && window.location ? window.location.hostname : '';

          setEventData({
            cID: cID,
            lID: lID,
            campID: campID,
            adSize: adSize,
            slot_id: slot_id,
            isEmpty: isEmpty,
            sourceAgnosticCreativeId: sourceAgnosticCreativeId,
            sourceAgnosticLineItemId: sourceAgnosticLineItemId,
            advertiserId: advertiserId,
            domain: domain
          });

          var slot_div = document.getElementById(eventData.slotId);
          if (slot_div) {
            slot_div.addEventListener('mouseenter', function () {
              var timeoutId = slot_div.getAttribute('timeoutId');
              clearTimeout(timeoutId);
              slot_div.setAttribute('hasFocus', 'yes');
            });

            slot_div.addEventListener('mouseleave', function () {
              var timeoutId = setTimeout(function () {
                slot_div.setAttribute('hasFocus', 'no');
              }, 60);
              slot_div.setAttribute('timeoutId', timeoutId);
            });

            document.addEventListener('visibilitychange', function () {
              if (!document.hidden) {
                return;
              }

              var hasFocus = slot_div.getAttribute('hasFocus');
              if (hasFocus == 'yes' && document.hidden) {
                slot_div.setAttribute('hasFocus', 'no');
                //Beam.report_beam_ad('Click', deviceType, cID, lID, campID, adSize, slotId)
                Segment.adClicked(domain, advertiserId, campID, cID, lID, adSize, isEmpty, sourceAgnosticCreativeId, sourceAgnosticLineItemId);
              }
            });
          } else {
            console.error('slot div not found:', slotId);
          }
        }
      },
      onSlotVisibilityChanged: handleVisibilityChange,
      shouldRefresh: function shouldRefresh(event) {
        if (adRendered && adRefreshable && refreshFlag) return true;else return false;
      },
      onSlotRegister: function onSlotRegister(e) {
        window.PQ && setTimeout(function () {
          getSignalsAndRefreshAds(e && e.slotId);
        }, 0);
      }
    })
  );
};

DFPAdSlot.propTypes = {
  adUnit: PropTypes.string.isRequired,
  slotId: PropTypes.string,
  className: PropTypes.string,
  sizeMapping: PropTypes.array,
  sizes: PropTypes.array
};

export default DFPAdSlot;
