import { useMemo } from 'react';
import { normalizeGap, calculateFlexBasis, DIRECTION_MAP, WRAP_MAP, JUSTIFY_MAP, ALIGN_MAP, ALIGN_CONTENT_MAP } from "../utils";

/**
 * useGridStyle Hook 参数
 */

/**
 * 计算 Grid 布局样式的 Hook
 * @param params - 布局参数
 * @returns 容器样式和子元素样式
 * @description
 * - 根据传入的布局参数计算容器的 flex 样式
 * - 根据 columns 和 gap 计算子元素的 flex-basis
 * - 使用 useMemo 缓存计算结果，避免不必要的重复计算
 */
export var useGridStyle = function useGridStyle(params) {
  var _params$direction = params.direction,
    direction = _params$direction === void 0 ? 'horizontal' : _params$direction,
    _params$wrap = params.wrap,
    wrap = _params$wrap === void 0 ? 'nowrap' : _params$wrap,
    columns = params.columns,
    _params$equalWidth = params.equalWidth,
    equalWidth = _params$equalWidth === void 0 ? false : _params$equalWidth,
    gap = params.gap,
    rowGap = params.rowGap,
    columnGap = params.columnGap,
    _params$justify = params.justify,
    justify = _params$justify === void 0 ? 'start' : _params$justify,
    _params$align = params.align,
    align = _params$align === void 0 ? 'stretch' : _params$align,
    _params$alignContent = params.alignContent,
    alignContent = _params$alignContent === void 0 ? 'stretch' : _params$alignContent;

  /**
   * 计算容器样式
   */
  var containerStyle = useMemo(function () {
    var style = {
      display: 'flex',
      flexDirection: DIRECTION_MAP[direction],
      flexWrap: WRAP_MAP[wrap],
      justifyContent: JUSTIFY_MAP[justify],
      alignItems: ALIGN_MAP[align]
    };

    // 多行对齐（仅在 wrap 不为 nowrap 时有效）
    if (wrap !== 'nowrap') {
      style.alignContent = ALIGN_CONTENT_MAP[alignContent];
    }

    // 间距处理：rowGap/columnGap 优先级高于 gap
    var normalizedGap = normalizeGap(gap);
    var normalizedRowGap = normalizeGap(rowGap);
    var normalizedColumnGap = normalizeGap(columnGap);
    if (normalizedRowGap || normalizedColumnGap) {
      // 单独设置行列间距
      if (normalizedRowGap) {
        style.rowGap = normalizedRowGap;
      }
      if (normalizedColumnGap) {
        style.columnGap = normalizedColumnGap;
      }
      // 如果只设置了其中一个，另一个使用 gap 的值
      if (normalizedGap) {
        if (!normalizedRowGap) {
          style.rowGap = normalizedGap;
        }
        if (!normalizedColumnGap) {
          style.columnGap = normalizedGap;
        }
      }
    } else if (normalizedGap) {
      // 统一设置间距
      style.gap = normalizedGap;
    }
    return style;
  }, [direction, wrap, justify, align, alignContent, gap, rowGap, columnGap]);

  /**
   * 计算子元素样式
   */
  var itemStyle = useMemo(function () {
    var style = {
      alignItems: 'stretch'
    };

    // 优先级：columns > equalWidth
    if (columns !== undefined && columns > 0) {
      // 使用 columns 时，计算 flex-basis，考虑 gap 影响
      // 优先使用 columnGap，其次使用 gap
      var effectiveGap = columnGap !== null && columnGap !== void 0 ? columnGap : gap;
      style.flexBasis = calculateFlexBasis(columns, effectiveGap);
      style.flexGrow = 0;
      style.flexShrink = 0;
    } else if (equalWidth) {
      // 等分模式
      style.flexGrow = 1;
      style.flexShrink = 1;
      style.flexBasis = 0;
    } else {
      // 默认：自适应内容宽度
      style.flexGrow = 0;
      style.flexShrink = 0;
      style.flexBasis = 'auto';
    }
    return style;
  }, [columns, equalWidth, gap, columnGap]);
  return {
    containerStyle: containerStyle,
    itemStyle: itemStyle
  };
};
export default useGridStyle;