import createBlink from '../main';
import jest from 'jest-mock';

enum PAGES {
  FIRST = 'FIRST_PAGE',
  SECOND = 'SECOND_PAGE',
}

describe('Ad impression intregration test', () => {
  it('should not send if only screen enter event', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });

    // First send of a pageInit event, to set the general state
    // Here we can attach the previous pageView, to track the chain of events
    blink.pageInit({
      url: 'http://some.site',
      pageView: 'the-pageview-id',
      referrer: 'www.sol.no',
      site: 'www.kk.no',
    });

    blink.adScreenEnter({ id: 'ad-topbanner', time: new Date(3) });

    // We don't want anything to be sent at this point
    expect(mockSend.mock.calls.length).toBe(0);
  });

  it('should send an event if first getting enter and then exit event', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });
    // First send of a pageInit event, to set the general state
    blink.pageInit({
      url: 'http://some.site',
      pageView: 'ad-pageview-id',
      referrer: 'www.sol.no',
      site: 'www.kk.no',
    });
    expect(mockSend.mock.calls.length).toBe(0);

    blink.adScreenEnter({ id: 'ad-banner-top', time: new Date(1000) });
    // We don't want anything to be sent at this point
    expect(mockSend.mock.calls.length).toBe(0);
    blink.adScreenExit({ id: 'ad-banner-top', time: new Date(5000) });
    expect(mockSend.mock.calls.length).toBe(1);

    const sentImpEvent = mockSend.mock.calls[0][0][0];
    expect(sentImpEvent.referrer).toBe('www.sol.no');
    expect(sentImpEvent.pageView).toBe('ad-pageview-id');
    expect(sentImpEvent.inscreenTime).toBe(4000);
    expect(sentImpEvent.inscreenTime0).toBe(0);
  });

  it('should send correct time for event with page hidden inbetween', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });
    // First send of a pageInit event, to set the general state
    blink.pageInit({
      url: 'http://some.site',
      pageView: 'ad-pageview-id',
      referrer: 'www.sol.no',
      site: 'www.kk.no',
    });
    expect(mockSend.mock.calls.length).toBe(0);

    blink.adScreenEnter({ id: 'ad-banner-top', time: new Date(1000) });
    // We don't want anything to be sent at this point
    expect(mockSend.mock.calls.length).toBe(0);

    // Hide the page
    blink.screenHide(new Date(2000));

    // Show the page again
    blink.screenShow(new Date(3500));

    blink.adScreenExit({ id: 'ad-banner-top', time: new Date(5000) });
    expect(mockSend.mock.calls.length).toBe(1);

    const sentImpEvent = mockSend.mock.calls[0][0][0];
    expect(sentImpEvent.referrer).toBe('www.sol.no');
    expect(sentImpEvent.pageView).toBe('ad-pageview-id');
    expect(sentImpEvent.inscreenTime).toBe(2500);
    expect(sentImpEvent.inscreenTime0).toBe(0);
  });

  it('should send two separate events for two separate pages', () => {
    const mockSend = jest.fn();
    const blink = createBlink({
      send: mockSend,
      sendDirect: mockSend,
    });

    // FIRST PAGE INIT
    blink.pageInit({
      url: 'http://some.site',
      pageView: `${PAGES.FIRST}-pageview`,
      pageId: PAGES.FIRST,
      referrer: 'www.sol.no',
      site: 'www.kk.no',
    });

    // SECOND PAGE INIT
    blink.pageInit({
      url: 'http://other.site',
      pageView: `${PAGES.SECOND}-pageview`,
      pageId: PAGES.SECOND,
      referrer: 'www.sol.no',
      site: 'www.kk.no',
    });

    // FIRST PAGE AD ENTER
    blink.adScreenEnter({
      id: 'ad-banner-top',
      pageId: PAGES.FIRST,
      time: new Date(1000),
    });

    // SECOND PAGE AD ENTER
    blink.adScreenEnter({
      id: 'ad-banner-top',
      pageId: PAGES.SECOND,
      time: new Date(1500),
    });

    // We don't want anything to be sent at this point
    expect(mockSend.mock.calls.length).toBe(0);

    // FIRST PAGE AD EXIT
    blink.adScreenExit({
      id: 'ad-banner-top',
      pageId: PAGES.FIRST,
      time: new Date(5000),
    });
    expect(mockSend.mock.calls.length).toBe(1);

    // SECOND PAGE AD EXIT
    blink.adScreenExit({
      id: 'ad-banner-top',
      pageId: PAGES.SECOND,
      time: new Date(7000),
    });
    expect(mockSend.mock.calls.length).toBe(2);

    // Check first event
    const firstEvent = mockSend.mock.calls[0][0][0];
    expect(firstEvent.referrer).toBe('www.sol.no');
    expect(firstEvent.pageView).toBe('FIRST_PAGE-pageview');
    expect(firstEvent.inscreenTime).toBe(4000);
    expect(firstEvent.inscreenTime0).toBe(0);

    // Check first event
    const secondEvent = mockSend.mock.calls[1][0][0];
    expect(secondEvent.referrer).toBe('www.sol.no');
    expect(secondEvent.pageView).toBe('SECOND_PAGE-pageview');
    expect(secondEvent.inscreenTime).toBe(5500);
    expect(secondEvent.inscreenTime0).toBe(0);
  });
});
