import DragRotateAndZoom from '../../../../../src/ol/interaction/DragRotateAndZoom.js';
import Event from '../../../../../src/ol/events/Event.js';
import Map from '../../../../../src/ol/Map.js';
import MapBrowserEvent from '../../../../../src/ol/MapBrowserEvent.js';
import VectorLayer from '../../../../../src/ol/layer/Vector.js';
import VectorSource from '../../../../../src/ol/source/Vector.js';
import View from '../../../../../src/ol/View.js';

describe('ol.interaction.DragRotateAndZoom', function () {
  describe('constructor', function () {
    it('can be constructed without arguments', function () {
      const instance = new DragRotateAndZoom();
      expect(instance).to.be.an(DragRotateAndZoom);
    });
  });

  describe('#handleDragEvent()', function () {
    let target, map, interaction;

    const width = 360;
    const height = 180;

    beforeEach(function (done) {
      target = document.createElement('div');
      const style = target.style;
      style.position = 'absolute';
      style.left = '-1000px';
      style.top = '-1000px';
      style.width = width + 'px';
      style.height = height + 'px';
      document.body.appendChild(target);
      const source = new VectorSource();
      const layer = new VectorLayer({source: source});
      interaction = new DragRotateAndZoom();
      map = new Map({
        target: target,
        layers: [layer],
        interactions: [interaction],
        view: new View({
          projection: 'EPSG:4326',
          center: [0, 0],
          resolution: 1,
        }),
      });
      map.once('postrender', function () {
        done();
      });
    });

    afterEach(function () {
      map.dispose();
      document.body.removeChild(target);
    });

    it('does not rotate when rotation is disabled on the view', function () {
      const pointerEvent = new Event();
      pointerEvent.type = 'pointermove';
      pointerEvent.clientX = 20;
      pointerEvent.clientY = 10;
      pointerEvent.pointerType = 'mouse';
      let event = new MapBrowserEvent('pointermove', map, pointerEvent, true);
      interaction.lastAngle_ = Math.PI;

      let callCount = 0;

      let view = map.getView();
      view.on('change:rotation', function () {
        callCount++;
      });

      interaction.handleDragEvent(event);
      expect(callCount).to.be(1);
      expect(interaction.lastAngle_).to.be(-0.8308214428190254);

      callCount = 0;
      view = new View({
        projection: 'EPSG:4326',
        center: [0, 0],
        resolution: 1,
        enableRotation: false,
      });
      map.setView(view);
      view.on('change:rotation', function () {
        callCount++;
      });

      pointerEvent.type = 'pointermove';
      pointerEvent.clientX = 24;
      pointerEvent.clientY = 16;
      pointerEvent.pointerType = 'mouse';
      event = new MapBrowserEvent('pointermove', map, pointerEvent, true);

      interaction.handleDragEvent(event);
      expect(callCount).to.be(0);
    });
  });
});
