<template>
  <view :style="[customStyle]" class="mix-icon" @tap="click" :class="['mix-icon--' + labelPos]">
    <image class="mix-icon__img" v-if="isImg" :src="name" :mode="imgMode" :style="[imgStyle]"></image>
    <text v-else class="mix-icon__icon" :class="customClass" :style="[iconStyle]" :hover-class="hoverClass" @touchstart="touchstart"></text>
    <text
      v-if="label"
      class="mix-icon__label"
      :style="{
        color: labelColor,
        fontSize: addUnit(labelSize),
        marginLeft: labelPos == 'right' ? addUnit(marginLeft) : 0,
        marginTop: labelPos == 'bottom' ? addUnit(marginTop) : 0,
        marginRight: labelPos == 'left' ? addUnit(marginRight) : 0,
        marginBottom: labelPos == 'top' ? addUnit(marginBottom) : 0
      }"
    >
      {{ label }}
    </text>
  </view>
</template>

<script>
/**
 * 基于字体的图标集，包含了大多数常见场景的图标。
 * @since 0.0.1
 * @displayName Icon
 * @property {String} name 图标名称，见示例图标集
 * @property {String} color 图标颜色，可接受主题色（默认inherit）
 * @property {String | Number} size 图标字体大小，单位rpx（默认32）
 * @property {Boolean} bold = [true|false] 是否显示粗体
 * @property {String} index 一个用于区分多个图标的值，点击图标时通过click事件传出
 * @property {String} hover-class 图标按下去的样式类，用法同uni的view组件的hover-class参数，详情见官网
 * @property {String} custom-prefix 自定义字体图标库时，需要写上此值
 * @property {String} label 图标右侧的label文字（默认28）
 * @property {String} label-pos = [right|bottom|top|left] label文字相对于图标的位置，只能right或bottom（默认right）
 * @property {String | Number} label-size label字体大小，单位rpx（默认28）
 * @property {String} label-color label字体颜色（默认#606266）
 * @property {String | Number} margin-left label在右侧时与图标的距离，单位rpx（默认6）
 * @property {String | Number} margin-top label在下方时与图标的距离，单位rpx（默认6）
 * @property {String | Number} margin-bottom label在上方时与图标的距离，单位rpx（默认6）
 * @property {String | Number} margin-right label在左侧时与图标的距离，单位rpx（默认6）
 * @property {String} img-mode 图片的mode（默认widthFix），详情见官网
 * @property {Object} custom-style 自定义icon的样式，对象形式
 * @property {String} width 用于显示图片小图标时，图片的宽度
 * @property {String} height 用于显示图片小图标时，图片的高度
 * @property {String | Number} top 用于解决某些情况下，让图标垂直居中的用途，单位rpx（默认0）
 * @event {Function} click 点击图标时触发
 */
export default {
  name: 'mix-icon',
  props: {
    /**
     * 图标名称，见示例图标集
     */
    name: { type: String, default: '' },
    /**
     * 图标颜色（默认inherit）
     */
    color: { type: String, default: '' },
    /**
     * 图标字体大小，单位rpx
     */
    size: { type: [Number, String], default: 'inherit' },
    /**
     * 是否显示粗体
     */
    bold: { type: Boolean, default: false },
    /**
     * 一个用于区分多个图标的值，点击图标时通过click事件传出（用于区分点击了哪一个）
     */
    index: { type: [Number, String], default: '' },
    /**
     * 图标按下去的样式类，用法同uni的view组件的hover-class参数，详情见官网
     */
    hoverClass: { type: String, default: '' },
    /**
     * 自定义扩展前缀，自定义字体图标库时，需要写上此值
     */
    customPrefix: { type: String, default: 'wb-icon' },
    /**
     * 图标的label文字
     */
    label: { type: String, default: '' },
    /**
     * label的位置，right /bottom / top / left（默认right）
     */
    labelPos: { type: String, default: 'right' },
    /**
     * label字体大小，单位rpx
     */
    labelSize: { type: [String, Number], default: '28' },
    /**
     * label字体颜色
     */
    labelColor: { type: String, default: '#606266' },
    /**
     * label在右侧时与图标的距离，单位rpx
     */
    marginLeft: { type: [String, Number], default: '6' },
    /**
     * label在下方时与图标的距离，单位rpx
     */
    marginTop: { type: [String, Number], default: '6' },
    /**
     * label在左侧时与图标的距离，单位rpx
     */
    marginRight: { type: [String, Number], default: '6' },
    /**
     * label在上方时与图标的距离，单位rpx（默认6）
     */
    marginBottom: { type: [String, Number], default: '6' },
    // 图片的mode
    imgMode: { type: String, default: 'widthFix' },
    /**
     * 自定义icon的样式，对象形式
     */
    customStyle: {
      type: Object,
      default() {
        return {}
      }
    },
    /**
     *  用于显示图片小图标时，图片的宽度
     */
    width: { type: [String, Number], default: '' },
    /**
     *  用于显示图片小图标时，图片的高度
     */
    height: { type: [String, Number], default: '' },
    /**
     * 用于解决某些情况下，让图标垂直居中的用途
     */
    top: { type: [String, Number], default: 0 }
  },
  computed: {
    customClass() {
      let classes = []
      classes.push(this.customPrefix + '-' + this.name)
      // 的自定义图标类名为wb-iconfont
      if (this.customPrefix == 'wb-icon') classes.push('wb-iconfont')
      else classes.push(this.customPrefix)
      // 主题色，通过类配置
      if (this.color && this.$mix.config.type.includes(this.color)) classes.push('mix-icon__icon--' + this.color)
      // 阿里，头条，百度小程序通过数组绑定类名时，无法直接使用[a, b, c]的形式，否则无法识别
      // 故需将其拆成一个字符串的形式，通过空格隔开各个类名
      //#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
      classes = classes.join(' ')
      //#endif
      return classes
    },
    iconStyle() {
      let style = {}
      style = {
        fontSize: this.size == 'inherit' ? 'inherit' : this.addUnit(this.size),
        fontWeight: this.bold ? 'bold' : 'normal',
        // 某些特殊情况需要设置一个到顶部的距离，才能更好的垂直居中
        top: this.addUnit(this.top)
      }
      // 非主题色值时，才当作颜色值
      if (this.color && !this.$mix.config.type.includes(this.color)) style.color = this.color
      return style
    },
    // 判断传入的name属性，是否图片路径，只要带有"/"均认为是图片形式
    isImg() {
      return this.name.indexOf('/') !== -1
    },
    imgStyle() {
      let style = {}
      // 如果设置width和height属性，则优先使用，否则使用size属性
      style.width = this.width ? this.addUnit(this.width) : this.addUnit(this.size)
      style.height = this.height ? this.addUnit(this.height) : this.addUnit(this.size)
      return style
    }
  },
  methods: {
    click() {
      /**
       * 点击图标时触发
       * @event click
       * @property {String | Number} index 通过props传递的index值
       */
      this.$emit('click', this.index)
    },
    touchstart() {
      /**
       * 点击图标时触发
       * @event click
       * @property {String | Number} index 通过props传递的index值
       */
      this.$emit('touchstart', this.index)
    }
  }
}
</script>
<style >
</style>
<style scoped lang="scss">
@import '../../font/iconfont.css';
@import '../../theme.scss';
.mix-icon {
  display: inline-flex;
  align-items: center;

  &--left {
    flex-direction: row-reverse;
    align-items: center;
  }

  &--right {
    flex-direction: row;
    align-items: center;
  }

  &--top {
    flex-direction: column-reverse;
    justify-content: center;
  }

  &--bottom {
    flex-direction: column;
    justify-content: center;
  }

  &__icon {
    position: relative;

    &--primary {
      color: $mix-c-primary;
    }

    &--success {
      color: $mix-c-success;
    }

    &--error {
      color: $mix-c-error;
    }

    &--warning {
      color: $mix-c-warning;
    }

    &--info {
      color: $mix-c-info;
    }
  }

  &__img {
    height: auto;
    will-change: transform;
  }

  &__label {
    line-height: 1;
  }
}
</style>
