import { useEvent, useMemo, useState } from 'functional-mini/component';
import { mountComponent } from '../../_util/component';
import { useComponentEvent } from '../../_util/hooks/useComponentEvent';
import { useComponentUpdateEffect } from '../../_util/hooks/useLayoutEffect';
import { useMixState } from '../../_util/hooks/useMixState';
import { resolveEventValues } from '../../_util/platform';
import { CascaderFunctionalProps } from './props';
import { defaultFormat, getterColumns, getValidValue } from './utils';
var CascaderPicker = function (props) {
    var _a = useMixState(props.defaultValue, {
        value: props.value,
    }), realValue = _a[0], _b = _a[1], isRealValueControlled = _b.isControlled, updateRealValue = _b.update;
    var _c = useState(function () {
        var value = props.value || props.defaultValue || [];
        var columns = getterColumns(props.value || props.defaultValue, props.options);
        return { columns: columns, value: value };
    }), _d = _c[0], value = _d.value, columns = _d.columns, setState = _c[1];
    var _e = useComponentEvent(props), triggerEventOnly = _e.triggerEventOnly, triggerEventValues = _e.triggerEventValues, triggerEvent = _e.triggerEvent;
    useComponentUpdateEffect(function () {
        var newColumns = getterColumns(props.value, props.options);
        var value = getValidValue(props.value, newColumns);
        setState({ value: value, columns: newColumns });
    }, [
        props.value,
        props.options,
        /**
         * 这里不要删
         *
         * 1. picker 触发 onOk
         * 2. 更新 realValue
         * 3. picker 触发 onFormat (此时 realValue 未更新)
         * 4. 依赖里的 realValue 更新
         * 5. 触发组件再次渲染
         * 6. 此时 onFormat 读取到最新的realValue
         */
        realValue,
    ]);
    function getOptionByValue(value, options) {
        var _a;
        if (!((value === null || value === void 0 ? void 0 : value.length) > 0))
            return null;
        var result = [];
        var item = options.find(function (v) { return v.value === value[0]; });
        var _loop_1 = function (i) {
            if (!item) {
                return { value: null };
            }
            result.push({
                value: item.value,
                label: item.label,
            });
            item = (_a = item.children) === null || _a === void 0 ? void 0 : _a.find(function (v) { return v.value === value[i + 1]; });
        };
        for (var i = 0; i < value.length; i++) {
            var state_1 = _loop_1(i);
            if (typeof state_1 === "object")
                return state_1.value;
        }
        return result;
    }
    useEvent('onCancel', function (e) {
        triggerEventOnly('cancel', e);
    });
    var formattedValueText = useMemo(function () {
        var onFormat = props.onFormat;
        if (typeof onFormat === 'function') {
            var formatValueByProps = onFormat(realValue, getOptionByValue(realValue, props.options));
            if (typeof formatValueByProps !== 'undefined') {
                return formatValueByProps;
            }
        }
        return defaultFormat(realValue, getOptionByValue(realValue, props.options));
    }, [realValue]);
    useEvent('onVisibleChange', function (visible) {
        if (visible) {
            var newColumns = getterColumns(realValue, props.options);
            var currentValue = getValidValue(realValue, newColumns);
            setState({ value: currentValue, columns: newColumns });
        }
        triggerEvent('visibleChange', visible);
    });
    useEvent('onOk', function () {
        // 完成时再次校验value,避免visible状态下props无效
        var validValue = getValidValue(value, columns);
        if (!isRealValueControlled) {
            updateRealValue(validValue);
        }
        triggerEventValues('ok', [
            validValue,
            getOptionByValue(validValue, props.options),
        ]);
    });
    useEvent('onChange', function (event) {
        var selectedValue = resolveEventValues(event)[0];
        var newColumns = getterColumns(selectedValue, props.options);
        var value = getValidValue(selectedValue, newColumns);
        setState({ value: value, columns: newColumns });
        triggerEventValues('change', [
            selectedValue,
            getOptionByValue(selectedValue, props.options),
        ]);
    });
    return {
        formattedValueText: formattedValueText,
        currentValue: value,
        columns: columns,
    };
};
mountComponent(CascaderPicker, CascaderFunctionalProps);