import { defineComponent, inject } from 'vue';
import PropsTypes from '../_util/vue-types';
import { getComponent, getSlot } from '../_util/props-util';
import { defaultConfigProvider } from '../config-provider';
import { VueNode, withInstall } from '../_util/type';
export const CommentProps = {
  actions: PropsTypes.array,
  /** The element to display as the comment author. */
  author: PropsTypes.VNodeChild,
  /** The element to display as the comment avatar - generally an antd Avatar */
  avatar: PropsTypes.VNodeChild,
  /** The main content of the comment */
  content: PropsTypes.VNodeChild,
  /** Comment prefix defaults to '.ant-comment' */
  prefixCls: PropsTypes.string,
  /** A datetime element containing the time to be displayed */
  datetime: PropsTypes.VNodeChild,
};

const Comment = defineComponent({
  name: 'AComment',
  props: CommentProps,
  setup() {
    return {
      configProvider: inject('configProvider', defaultConfigProvider),
    };
  },
  methods: {
    getAction(actions: VueNode[]) {
      if (!actions || !actions.length) {
        return null;
      }
      const actionList = actions.map((action, index) => <li key={`action-${index}`}>{action}</li>);
      return actionList;
    },
    renderNested(prefixCls: string, children: VueNode) {
      return <div class={`${prefixCls}-nested`}>{children}</div>;
    },
  },

  render() {
    const { prefixCls: customizePrefixCls } = this.$props;

    const getPrefixCls = this.configProvider.getPrefixCls;
    const prefixCls = getPrefixCls('comment', customizePrefixCls);

    const actions = getComponent(this, 'actions');
    const author = getComponent(this, 'author');
    const avatar = getComponent(this, 'avatar');
    const content = getComponent(this, 'content');
    const datetime = getComponent(this, 'datetime');

    const avatarDom = (
      <div class={`${prefixCls}-avatar`}>
        {typeof avatar === 'string' ? <img src={avatar} alt="comment-avatar" /> : avatar}
      </div>
    );

    const actionDom = actions ? (
      <ul class={`${prefixCls}-actions`}>
        {this.getAction(Array.isArray(actions) ? actions : [actions])}
      </ul>
    ) : null;

    const authorContent = (
      <div class={`${prefixCls}-content-author`}>
        {author && <span class={`${prefixCls}-content-author-name`}>{author}</span>}
        {datetime && <span class={`${prefixCls}-content-author-time`}>{datetime}</span>}
      </div>
    );

    const contentDom = (
      <div class={`${prefixCls}-content`}>
        {authorContent}
        <div class={`${prefixCls}-content-detail`}>{content}</div>
        {actionDom}
      </div>
    );

    const comment = (
      <div class={`${prefixCls}-inner`}>
        {avatarDom}
        {contentDom}
      </div>
    );
    const children = getSlot(this);
    return (
      <div class={prefixCls}>
        {comment}
        {children && children.length ? this.renderNested(prefixCls, children) : null}
      </div>
    );
  },
});

export default withInstall(Comment);