@use 'sass:map';
@use 'sass:list';
@use 'sass:meta';
@use './list' as custom-list;

@function is-map($map) {
    @return meta.type-of($map) == 'map';
}

@function flatten-map($map, $path-items: [], $ignore-keys: []) {
    $result: ();

    $path: custom-list.join-list($path-items, '-');

    @each $key in map.keys($map) {
        @if list.index($ignore-keys, $key) == null {
            $value: map.get($map, $key);

            @if is-map($value) {
                $child-path-items: list.append($path-items, $key);
                $child: flatten-map($value, $child-path-items, $ignore-keys);
                $result: map.merge($result, $child);
            } @else {
                @if $value != null {
                    $result: map.set($result, --#{$path}-#{$key}, #{$value});
                }
            }
        }
    }

    @return $result;
}

@function destructure-map($map) {
    $result: [];

    @each $key in map.keys($map) {
        $value: map.get($map, $key);

        @if is-map($value) {
            $destructured-value: destructure-map($value);

            @each $destructured-value-item in $destructured-value {
                $item: (
                    path: list.join([$key], map.get($destructured-value-item, path)),
                    value: map.get($destructured-value-item, value)
                );

                $result: list.append($result, $item);
            }
        } @else {
            $result: list.append(
                $result,
                (
                    path: [$key],
                    value: $value
                )
            );
        }
    }

    @return $result;
}
