import PropTypes from '../_util/vue-types';
import classNames from 'classnames';
import { getOptionProps } from '../_util/props-util';

export const BasicProps = {
  prefixCls: PropTypes.string,
  hasSider: PropTypes.boolean,
};

function generator(props, name) {
  return BasicComponent => {
    return {
      name,
      props: BasicComponent.props,
      render() {
        const { prefixCls } = props;
        const basicComponentProps = {
          props: {
            prefixCls,
            ...getOptionProps(this),
          },
          on: this.$listeners,
        };
        return <BasicComponent {...basicComponentProps}>{this.$slots.default}</BasicComponent>;
      },
    };
  };
}

const Basic = {
  props: BasicProps,
  render() {
    const { prefixCls, $slots, $listeners } = this;
    const divProps = {
      class: prefixCls,
      on: $listeners,
    };
    return <div {...divProps}>{$slots.default}</div>;
  },
};

const BasicLayout = {
  props: BasicProps,
  data() {
    return {
      siders: [],
    };
  },
  provide() {
    return {
      siderHook: {
        addSider: id => {
          this.siders = [...this.siders, id];
        },
        removeSider: id => {
          this.siders = this.siders.filter(currentId => currentId !== id);
        },
      },
    };
  },
  render() {
    const { prefixCls, $slots, hasSider, $listeners } = this;
    const divCls = classNames(prefixCls, {
      [`${prefixCls}-has-sider`]: hasSider || this.siders.length > 0,
    });
    const divProps = {
      class: divCls,
      on: $listeners,
    };
    return <div {...divProps}>{$slots.default}</div>;
  },
};

const Layout = generator(
  {
    prefixCls: 'ant-layout',
  },
  'ALayout',
)(BasicLayout);

const Header = generator(
  {
    prefixCls: 'ant-layout-header',
  },
  'ALayoutHeader',
)(Basic);

const Footer = generator(
  {
    prefixCls: 'ant-layout-footer',
  },
  'ALayoutFooter',
)(Basic);

const Content = generator(
  {
    prefixCls: 'ant-layout-content',
  },
  'ALayoutContent',
)(Basic);

Layout.Header = Header;
Layout.Footer = Footer;
Layout.Content = Content;

export default Layout;