// Utils
import { createNamespace } from '../utils';
import { BORDER_SURROUND, WHITE } from '../utils/constant';
import { routeProps, route } from '../utils/router';

// Components
import Icon from '../icon';
import Loading from '../loading';

const [createComponent, bem] = createNamespace('button');

export default createComponent({
  props: {
    ...routeProps,
    text: String,
    icon: String,
    color: String,
    block: Boolean,
    plain: Boolean,
    round: Boolean,
    square: Boolean,
    loading: Boolean,
    hairline: Boolean,
    disabled: Boolean,
    iconPrefix: String,
    nativeType: String,
    loadingText: String,
    loadingType: String,
    tag: {
      type: String,
      default: 'button',
    },
    type: {
      type: String,
      default: 'default',
    },
    size: {
      type: String,
      default: 'normal',
    },
    loadingSize: {
      type: String,
      default: '20px',
    },
  },

  methods: {
    onClick() {
      if (!this.loading && !this.disabled) {
        this.$emit('click', event);
        route(this.$router, this);
      }
    },

    onTouchstart(event) {
      this.$emit('touchstart', event);
    },

    genContent() {
      const Content = [];

      if (this.loading) {
        Content.push(
          <Loading
            class={bem('loading')}
            size={this.loadingSize}
            type={this.loadingType}
            color="currentColor"
          />
        );
      } else if (this.icon) {
        Content.push(
          <Icon
            name={this.icon}
            class={bem('icon')}
            classPrefix={this.iconPrefix}
          />
        );
      }

      let text;
      if (this.loading) {
        text = this.loadingText;
      } else {
        text = this.$slots.default ? this.$slots.default() : this.text;
      }

      if (text) {
        Content.push(<span class={bem('text')}>{text}</span>);
      }

      return Content;
    },
  },

  render() {
    const { tag, type, color, plain, disabled, loading, hairline } = this;

    const style = {};

    if (color) {
      style.color = plain ? color : WHITE;

      if (!plain) {
        // Use background instead of backgroundColor to make linear-gradient work
        style.background = color;
      }

      // hide border when color is linear-gradient
      if (color.indexOf('gradient') !== -1) {
        style.border = 0;
      } else {
        style.borderColor = color;
      }
    }

    const classes = [
      bem([
        type,
        this.size,
        {
          plain,
          loading,
          disabled,
          hairline,
          block: this.block,
          round: this.round,
          square: this.square,
        },
      ]),
      { [BORDER_SURROUND]: hairline },
    ];

    return (
      <tag
        style={style}
        class={classes}
        type={this.nativeType}
        disabled={disabled}
        onClick={this.onClick}
        onTouchstart={this.onTouchstart}
      >
        <div class={bem('content')}>{this.genContent()}</div>
      </tag>
    );
  },
});