import { event_listener_array, calc_delta_time } from './utils';

export function perspective_3d(class_name) {
    const elements = document.body.getElementsByClassName(class_name);

    let velocity_x = 0;
    let velocity_y = 0;
    let rotation_x = 0;
    let rotation_y = 0;
    let target_rotation_x = 0;
    let target_rotation_y = 0;

    (function update() {
        let dt = calc_delta_time();
        const ss = .08;

        velocity_x = spring(rotation_x, target_rotation_x, velocity_x, 10, dt);
        velocity_y = spring(rotation_y, target_rotation_y, velocity_y, 10, dt);
        rotation_x += velocity_x * dt * ss;
        rotation_y += velocity_y * dt * ss;

        const style = `perspective(700px) rotateX(${rotation_y}rad) rotateY(${rotation_x}rad)`;

        for (const el of elements) {
            el.style.transform = style;
        }

        requestAnimationFrame(update);
    })();

    event_listener_array(window, ["mousemove", "touchmove"], (e) => {
        if (e.changedTouches && e.changedTouches[0]) {
            e = e.changedTouches[0];
        }

        target_rotation_x = (e.clientX / window.innerWidth) * 2 - 1;
        target_rotation_y = -(e.clientY / window.innerHeight) * 2 + 1;

        target_rotation_x = clamp(target_rotation_x, -0.5, 0.5);
        target_rotation_y = clamp(target_rotation_y, -0.5, 0.5);
    }, false);

    function spring(position, target, velocity, omega, dt) {
        let n1 = velocity - (position - target) * (Math.pow(omega, 2) * dt);
        let n2 = 1 + omega * dt;
        return n1 / Math.pow(n2, 2);
    }
    function clamp(value, min, max) {
        return Math.min(Math.max(value, min), max);
    }
}

(function pick_greeting() {
    const hours = new Date().getHours();
    const greeing_el = document.querySelector(".greeting");

    if (hours < 6) {
        const data = "Good night";
        greeing_el.textContent = data;
        greeing_el.innerText = data;
    } else if (hours >= 6 && hours < 12) {
        const data = "Good morning";
        greeing_el.textContent = data;
        greeing_el.innerText = data;
    } else if (hours >= 12 && hours < 16) {
        const data = "Good afternoon";
        greeing_el.textContent = data;
        greeing_el.innerText = data;
    } else if (hours >= 16 && hours <= 23) {
        const data = "Good evening";
        greeing_el.textContent = data;
        greeing_el.innerText = data;
    } else {
        const data = "Hello";
        greeing_el.textContent = data;
        greeing_el.innerText = data;
    }

    setTimeout(pick_greeting, 6e4);
})();

(function render_time() {
    const time = new Date();
    let h = time.getHours();

    h = h.toString().padStart(2, 0);
    let m = time.getMinutes().toString().padStart(2, 0);
    let s = time.getSeconds().toString().padStart(2, 0);

    const clock_el = document.querySelector('.clock');
    if (!clock_el) return;

    const formatted_date = `${h}:${m}:${s}`;
    clock_el.textContent = formatted_date;
    clock_el.innerText = formatted_date;

    setTimeout(render_time, 1e3);
})();