/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import seedrandom from 'seedrandom';
import MockDate from './MockDate';

window.Date = MockDate;

if (typeof __TEST_PLAYBACK_SPEED__ === 'undefined') {
    window.__TEST_PLAYBACK_SPEED__ = 1;
}

let myRandom = new seedrandom('echarts-random');
// Random for echarts code.
// In case different echarts version called random different times.
// It will cause following random number all wrong.
let myRandom2 = new seedrandom('echarts-random-inner');
// Fixed random generator
Math.random = function () {
    const val = myRandom();
    return val;
};

window.__random__inner__ = function () {
    const val = myRandom2();
    return val;
};

window.addEventListener('DOMContentLoaded', () => {
    let style = document.createElement('style');
    // Disable all css animation since it will cause screenshot inconsistent.
    // PENDING Only tooltip? div[_echarts_instance_]>div
    style.innerHTML = `
* {
    transition-delay: 0s !important;
    transition-duration: 0s !important;
    animation-delay: -0.0001s !important;
    animation-duration: 0s !important;
}
    `;
    document.head.appendChild(style);


    // Prevent triggered mouseout event when mouse move out of window.
    // DON"T know why, but it happens occasionally and cause hover state/ tooltip wrong before screenshot.


    document.body.addEventListener('mouseout', e => {
        if (!e.relatedTarget) {
            e.stopPropagation();
            e.stopImmediatePropagation();
        }
    }, true);

    // Draw mouse
    const box = document.createElement('puppeteer-mouse-pointer');
    const styleElement = document.createElement('style');
    styleElement.innerHTML = `
puppeteer-mouse-pointer {
    pointer-events: none;
    position: absolute;
    top: 0;
    z-index: 10000;
    left: 0;
    width: 20px;
    height: 20px;
    background: rgba(0,0,0,.4);
    border: 1px solid white;
    border-radius: 10px;
    margin: -10px 0 0 -10px;
    padding: 0;
    transition: background .2s, border-radius .2s, border-color .2s;
}
puppeteer-mouse-pointer.button-1 {
    transition: none;
    background: rgba(0,0,0,0.9);
}
puppeteer-mouse-pointer.button-2 {
    transition: none;
    border-color: rgba(0,0,255,0.9);
}
puppeteer-mouse-pointer.button-3 {
    transition: none;
    border-radius: 4px;
}
puppeteer-mouse-pointer.button-4 {
    transition: none;
    border-color: rgba(255,0,0,0.9);
}
puppeteer-mouse-pointer.button-5 {
    transition: none;
    border-color: rgba(0,255,0,0.9);
}
`;
    document.head.appendChild(styleElement);
    document.body.appendChild(box);
    document.addEventListener('mousemove', event => {
        box.style.left = event.pageX + 'px';
        box.style.top = event.pageY + 'px';
        updateButtons(event.buttons);
    }, true);
    document.addEventListener('mousedown', event => {
        updateButtons(event.buttons);
        box.classList.add('button-' + event.which);
    }, true);
    document.addEventListener('mouseup', event => {
        updateButtons(event.buttons);
        box.classList.remove('button-' + event.which);
    }, true);
    function updateButtons(buttons) {
        for (let i = 0; i < 5; i++) {
            box.classList.toggle('button-' + i, buttons & (1 << i));
        }
    }
});