/**
 * Copyright 2020 Baidu Inc. All Rights Reserved.
 *
 * Licensed 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 type {DataListItem, Indicator} from './types';

function filterRow(row: DataListItem, indicators: Indicator[]): boolean {
    for (const indicator of indicators) {
        const value = row[indicator.group][indicator.name];
        // ignore null value
        if (value == null) {
            continue;
        }
        switch (indicator.type) {
            case 'numeric':
            case 'string': {
                if (
                    indicator.selectedValues != null &&
                    !(indicator.selectedValues as (string | number)[]).includes(value)
                ) {
                    return false;
                }
                continue;
            }
            case 'continuous': {
                if (indicator.min != null && indicator.max != null) {
                    if ('number' !== typeof value || value < indicator.min || value > indicator.max) {
                        return false;
                    }
                }
                continue;
            }
        }
    }
    return true;
}

export function filter(list: DataListItem[], indicators: Indicator[]): DataListItem[] {
    return list.reduce<typeof list>((m, row) => {
        if (filterRow(row, indicators)) {
            m.push(row);
        }
        return m;
    }, []);
}
