// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

import * as arrows from "../test_arrows";

export const data = [
    { x: 1, y: "a", z: true },
    { x: 2, y: "b", z: false },
    { x: 3, y: "c", z: true },
    { x: 4, y: "d", z: false },
];

export const int_float_data = [
    { w: 1.5, x: 1, y: "a", z: true },
    { w: 2.5, x: 2, y: "b", z: false },
    { w: 3.5, x: 3, y: "c", z: true },
    { w: 4.5, x: 4, y: "d", z: false },
];

export const int_float_subtract_data = [
    { u: 2.5, v: 2, w: 1.5, x: 1, y: "a", z: true },
    { u: 3.5, v: 3, w: 2.5, x: 2, y: "b", z: false },
    { u: 4.5, v: 4, w: 3.5, x: 3, y: "c", z: true },
    { u: 5.5, v: 5, w: 4.5, x: 4, y: "d", z: false },
];

export const comparison_data = [
    { u: 0, v: 1.5, w: 1.5, x: 1, x2: 1, y: "a", z: true },
    { u: 1, v: 2.55, w: 2.5, x: 2, x2: 10, y: "b", z: false },
    { u: 0, v: 3.5, w: 3.5, x: 3, x2: 3, y: "c", z: true },
    { u: 1, v: 4.55, w: 4.5, x: 4, x2: 10, y: "d", z: false },
];

export const cols = [
    "i8",
    "ui8",
    "i16",
    "ui16",
    "i32",
    "ui32",
    "i64",
    "ui64",
    "f32",
    "f64",
];
export const arrow = arrows.numbers_arrow;
export const all_types_arrow = arrows.all_types_arrow;
export const all_types_multi_arrow = arrows.all_types_multi_arrow;

export const days_of_week = [
    "1 Sunday",
    "2 Monday",
    "3 Tuesday",
    "4 Wednesday",
    "5 Thursday",
    "6 Friday",
    "7 Saturday",
];
export const months_of_year = [
    "01 January",
    "02 February",
    "03 March",
    "04 April",
    "05 May",
    "06 June",
    "07 July",
    "08 August",
    "09 September",
    "10 October",
    "11 November",
    "12 December",
];

export const second_bucket = function (val, multiplicity) {
    if (multiplicity === undefined) {
        multiplicity = 1;
    }
    const mult = 1000 * multiplicity;
    return new Date(Math.floor(new Date(val).getTime() / mult) * mult);
};

export const minute_bucket = function (val, multiplicity) {
    if (multiplicity === undefined) {
        multiplicity = 1;
    }
    let date = new Date(val);
    date.setSeconds(0);
    date.setMilliseconds(0);
    date.setMinutes(
        Math.floor(date.getMinutes() / multiplicity) * multiplicity,
    );
    return date;
};

export const hour_bucket = function (val, multiplicity) {
    if (multiplicity === undefined) {
        multiplicity = 1;
    }
    let date = new Date(val);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setMilliseconds(0);
    date.setHours(Math.floor(date.getHours() / multiplicity) * multiplicity);
    return date;
};

export const day_bucket = function (val) {
    let date = new Date(val);
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setMilliseconds(0);
    return date;
};

export const week_bucket = function (val) {
    let date = new Date(val);
    let day = date.getDay();
    let diff = date.getDate() - day + (day == 0 ? -6 : 1);
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setDate(diff);
    return date;
};

export const month_bucket = function (val, multiplicity) {
    if (multiplicity === undefined) {
        multiplicity = 1;
    }
    let date = new Date(val);
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setDate(1);
    date.setMonth(Math.floor(date.getMonth() / multiplicity) * multiplicity);
    return date;
};

export const year_bucket = function (val, multiplicity) {
    if (multiplicity === undefined) {
        multiplicity = 1;
    }
    let date = new Date(val);
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setDate(1);
    date.setMonth(0);
    date.setFullYear(
        Math.floor(date.getFullYear() / multiplicity) * multiplicity,
    );
    return date;
};
