import {apply as json_logic_apply} from "json-logic-js";
import {componentsList} from "./components/components";

// https://stackoverflow.com/a/70511311
export const true_type_of = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();

export function FillExtCardData(data, index) {
    return {
        has_other_dio: data.filter((value, item_index) => index !== item_index && value.name &&value.name.endsWith("-TTL")).length > 0,
        has_dds: data.filter(((value, _) => value.name === "DDS" && value.name_number === "4410" && (!value.options_data || !value.options_data.mono_eem))).length > 0,
        has_sampler: data.filter(((value, _) => value.name === "Sampler" && (!value.options_data || !value.options_data.mono_eem))).length > 0,
    }
}

export function FillExtCrateData(crate) {
    return {
        crate_mode: crate.crate_mode
    }
}

export function FillExtOrderData(crates, modes_order) {
    return {
        has_crate: crates.filter((crate) => modes_order.includes(crate.crate_mode)).length >= 1,
    }
}

export function FilterOptions(options, data) {
    let options_t = true_type_of(options);
    let target = {};

    if (options_t === "array") {
        options.map((option_item, _) => {
            Object.assign(target, FilterOptions(option_item, data))
        });
    } else if (options_t === "object") {
        if (
            true_type_of(options.type) === "string" &&
            (true_type_of(options.args) === "object" || true_type_of(options.items) === "array")
        ) {
            if (options.type in componentsList) {
                target[options.args.outvar] = data[options.args.outvar];
            } else if (options.type === "Group") {
                Object.assign(target, FilterOptions(json_logic_apply(options.items, data), data))
            }
        } else {
            Object.assign(target, FilterOptions(json_logic_apply(options, data), data))
        }
    }
    return target
}