import type { ExtractPropTypes, PropType } from 'vue';
import { defineComponent } from 'vue';

type widthUnit = number | string;
export const skeletonParagraphProps = () => ({
  prefixCls: String,
  width: { type: [Number, String, Array] as PropType<widthUnit[] | widthUnit> },
  rows: Number,
});

export type SkeletonParagraphProps = Partial<
  ExtractPropTypes<ReturnType<typeof skeletonParagraphProps>>
>;

const SkeletonParagraph = defineComponent({
  name: 'SkeletonParagraph',
  props: skeletonParagraphProps(),
  setup(props) {
    const getWidth = (index: number) => {
      const { width, rows = 2 } = props;
      if (Array.isArray(width)) {
        return width[index];
      }
      // last paragraph
      if (rows - 1 === index) {
        return width;
      }
      return undefined;
    };
    return () => {
      const { prefixCls, rows } = props;
      const rowList = [...Array(rows)].map((_, index) => {
        const width = getWidth(index);
        return (
          <li key={index} style={{ width: typeof width === 'number' ? `${width}px` : width }} />
        );
      });
      return <ul class={prefixCls}>{rowList}</ul>;
    };
  },
});

export default SkeletonParagraph;
