<template>
  <van-popup v-model="showPopup" position="bottom" class="van-order-coupon-list">
    <van-cell-group class="van-order-coupon-list__top">
      <van-field v-model="exchangeCode" :placeholder="inputPlaceholder" :maxlength="20" />
      <van-button size="small" type="danger" class="van-order-coupon-list__exchange" :disabled="exchangeButtonDisabled || !exchangeCode.length" @click="onClickExchangeButton">{{ exchangeButtonText }}</van-button>
    </van-cell-group>
    <div class="van-order-coupon-list__list" ref="list">
      <van-order-coupon-coupon
        ref="card"
        v-for="(item, index) in coupons"
        :key="item.id || item.name"
        :data="item"
        :chosen="index === chosenCoupon"
        @click.native="onClickCoupon(index)"
      />
      <h3 v-if="disabledCoupons.length">{{ disabledListTitle }}</h3>
      <van-order-coupon-coupon
        disabled
        v-for="item in disabledCoupons"
        :key="item.id || item.name"
        :data="item"
      />
    </div>
    <div class="van-order-coupon-list__close" @click="onClickNotUse">{{ closeButtonText }}</div>
  </van-popup>
</template>

<script>
import Cell from '../cell';
import CellGroup from '../cell-group';
import Coupon from './Coupon';
import Field from '../field';
import Popup from '../popup';
import Button from '../button';

export default {
  name: 'van-order-coupon-list',

  components: {
    [Button.name]: Button,
    [Cell.name]: Cell,
    [CellGroup.name]: CellGroup,
    [Field.name]: Field,
    [Popup.name]: Popup,
    [Coupon.name]: Coupon
  },

  model: {
    prop: 'show'
  },

  props: {
    show: {
      type: Boolean,
      default: false
    },
    chosenCoupon: {
      type: Number,
      default: -1
    },
    coupons: {
      type: Array,
      default: () => []
    },
    disabledCoupons: {
      type: Array,
      default: () => []
    },
    exchangeButtonText: {
      type: String,
      default: '兑换'
    },
    exchangeButtonDisabled: {
      type: Boolean,
      default: false
    },
    displayedCouponIndex: {
      type: Number,
      default: -1
    },
    closeButtonText: {
      type: String,
      default: '不使用优惠'
    },
    disabledListTitle: {
      type: String,
      default: '不可用优惠'
    },
    inputPlaceholder: {
      type: String,
      default: '请输入优惠码'
    }
  },

  watch: {
    show(val) {
      this.showPopup = val;
    },
    showPopup(val) {
      this.$emit('input', val);
      this.scrollToTop();
    },
    displayedCouponIndex(val) {
      this.scrollToShowCoupon(val);
    }
  },

  data() {
    return {
      exchangeCode: '',
      showPopup: this.show
    };
  },

  mounted() {
    this.scrollToShowCoupon(this.displayedCouponIndex);
  },

  methods: {
    onClickNotUse() {
      this.showPopup = false;
      this.$emit('change', -1);
    },
    onClickCoupon(index) {
      this.showPopup = false;
      this.$emit('change', index);
    },
    onClickExchangeButton() {
      this.$emit('exchange', this.exchangeCode);
      this.exchangeCode = '';
    },
    // 滚动到特定优惠券的位置
    scrollToShowCoupon(index) {
      if (index === -1) {
        return;
      }

      this.$nextTick(() => {
        const { card, list } = this.$refs;

        if (list && card && card[index]) {
          list.scrollTop = card[index].$el.offsetTop - 100;
        }
      });
    },
    scrollToTop() {
      const { list } = this.$refs;

      list.scrollTop = 0;
    }
  }
};
</script>
