Source: map/filters/builders/TimeDimension.js

import { AbstractBuilder } from "./AbstractBuilder.js";

/**
 * TimeDimension builder.
 * @extends AbstractBuilder
 * @memberof vef.map.filters.builders
 */
class TimeDimension extends AbstractBuilder {

    /**
     * Retrieves the filter parameters based on the harmonized filters.
     * @param {Object} harmonizedFilters - The harmonized filters.
     * @returns {Object} The filter parameters.
     */
    static getFilterParams(harmonizedFilters) {
        const params = {};

        for (let key in harmonizedFilters) {
            const filters = [];
            for (let i = 0; i < harmonizedFilters[key].length; ++i) {
                const values = harmonizedFilters[key][i];
                switch (values[0]) {
                    case "bt":
                        filters.push(this.bt(values[1], values[2]));
                        break;
                    case "eq":
                    case "like":
                        filters.push(this.eq(values[1]));
                        break;
                    case "gt":
                    case "gteq":
                        filters.push(this.ge(values[1]));
                        break;
                    case "lt":
                    case "lteq":
                        filters.push(this.le(values[1]));
                        break;
                    case "null":
                        break;
                }
            }

            const filter = this.or(filters).trim();
            if (filter.length) params[key] = filter;
        }

        return params;
    }

    /**
     * Builds a "between" filter string.
     * @param {string} begin - The beginning value.
     * @param {string} end - The ending value.
     * @returns {string} The filter string.
     */
    static bt(begin, end) {
        return `${begin}/${end}`;
    }

    /**
     * Builds an "equals" filter string.
     * @param {string} value - The value to compare.
     * @returns {string} The filter string.
     */
    static eq(value) {
        return value;
    }

    /**
     * Builds a "greater than or equals" filter string.
     * @param {string} value - The value to compare.
     * @returns {string} The filter string.
     */
    static ge(value) {
        return `${value}/9999-12-31T23:59:59.999Z`;
    }

    /**
     * Builds a "less than or equals" filter string.
     * @param {string} value - The value to compare.
     * @returns {string} The filter string.
     */
    static le(value) {
        return `0001-01-01T00:00:00.0Z/${value}`;
    }

    /**
     * Builds an "or" filter string.
     * @param {Array} filters - The filters to combine.
     * @returns {string} The filter string.
     */
    static or(filters) {
        return filters.join(", ");
    }
    
}

export { TimeDimension };